Django自带分页模块详解

page = Paginator(obj_list, per_page)

object_list : 一个列表,元祖或则Django 的Queryset 对象 或则其他对象带有 count() or len()的方法
per_page :就是1页显示几条数据

page对象的方法和属性
  • page .has_next() ----
    如果有下一页,则返回True。

  • page .has_previous() ----
    如果有上一页,返回 True。

  • page .has_other_pages()
    如果有上一页或下一页,返回True。

  • page .next_page_number()
    返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。

  • page .previous_page_number()
    返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。

  • page .start_index()
    返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。

  • page .end_index()
    返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index() 会返回 4。

  • page.number
    当前页码

  • page.paginator
    相关的Paginator对象。
page.paginator对象的属性
  • per_page: 每页显示条目数量
  • count: 数据总个数
  • num_pages:总页数
  • page_range:总页数的索引范围,页码的范围,从1开始,例如[1, 2, 3, 4]。
后端代码
# 得到表的对象的列表,因为 Paginator 第一个参数必须是可迭代的,第二个参数是每页展示的个数
model_all = admin_class.model.objects.all()
paginator = Paginator(model_all,1)
current_page = request.GET.get('page')


try:
    # paginator.page()得到的是一页的对象列表,所以前端不用再对
    # admin_class.model.objects.all()进行循环,而是循环posts
    posts = paginator.page(current_page)
 # 防止用户输入非法字符
except PageNotAnInteger:
    posts = paginator.page(1)
except EmptyPage:
    posts = paginator.page(paginator.num_pages)
前端代码
 <nav aria-label="">
     <ul class="pagination">
                        {# 判断posts是否有上一页#}
          {% if posts.has_previous %}
              <li class=""><a href="?page=1">首页</a></li>
              <li class=""><a href="?page={{ posts.previous_page_number }}">上一页</a></li>
          {% endif %}

                       {# 中间显示页码需要对所有的页码进行循环 #}
                       {# posts.paginator得到的又是一个paginator对象,只有paginator对象才有page_range方法 #}
          {% for loop_counter in posts.paginator.page_range %}
               {# 简单标签 #}
               {% loop_display_page loop_counter posts %}
          {% endfor %}

                        {# 判断posts是否有下一页#}
          {% if posts.has_next %}
               <li class=""><a href="?page={{ posts.next_page_number }}">下一页</a></li>
               <li><a href="?page={{ posts.paginator.num_pages }}">尾页</a></li>
          {% endif %}
      </ul>
 </nav>
简单标签代码
@register.simple_tag
def loop_display_page(loop_counter, posts):
    cls =''
    # 需求为只显示当前页码加左右两边各两个页码
    if abs(posts.number-loop_counter)<=2:
        # 如果循环到的页码等于当前页码,给页码加上 active 样式
        if loop_counter == posts.number:
            cls = "active"
        return mark_safe('<li class="%s"><a href="?page=%s">%s</a></li>'%(cls,loop_counter,loop_counter))
    # 防止分页最末尾出现 None
    return ''

分页改良版

效果图:


image.png

代码如下:

@register.simple_tag
def loop_display_page(posts, filter_conditions):
    fil = ''
    ele = ''
    flag = False
    for k ,v in filter_conditions.items():
        fil += '&%s=%s'%(k,v)

    for page_num in posts.paginator.page_range:
        # 前两页,后两页,当前页的两边都显示,其余的··表示
        if page_num < 3 or page_num > posts.paginator.num_pages-2 or abs(posts.number - page_num) <=1:
            cls =''
            if page_num == posts.number:
                flag = False
                cls = 'active'
            ele += '<li class="%s"><a href="?page=%s%s">%s</a></li>'%(cls,page_num,fil,page_num)

        elif flag == False:
            ele += '<li><a>··</a></li>'
            flag = True

    return mark_safe(ele)

!注意标志位的使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 方法一:使用pure_pagination进行分页 1. pure_pagination介绍 pure_pagin...
    Jlan阅读 1,126评论 0 7
  • Django 中已经写好了分页实现的逻辑,我们在做分页的时候,仅需要通过俩个对象Paginator 和 Page ...
    鸟它鸟阅读 281评论 0 0
  • 我们先在 shell 中演示分页器的用法: 分页器示例 现在我们在 view 中使用分页器: 浏览器打开:http...
    SingleDiego阅读 1,612评论 2 3
  • 当页面因需要展示的数据条目过多,导致无法在一个页面全部显示。这时,页面经常会采用分页形式进行展示,然后每页显示 2...
    猴哥爱读书阅读 33,426评论 4 20
  • 1、多特征变量及其相关概念 2、多变量线性回归,其中表达式可转化为向量相乘,注意令x0 = 1 3、 4、单变量线...
    mugtmag阅读 441评论 0 0