Django 分页器

我们先在 shell 中演示分页器的用法:

# 引入分页器模块
from django.core.paginator import Paginator

objects = ['john', 'paul', 'george', 'ringo']

# 对 objects 对象进行分页,每页2个对象
p = Paginator(objects, 2)

# 对象总数
p.count
>>> 4

# 总页数
p.num_pages
>>> 2

# 获取某页的对象
page1 = p.page(1)
page2 = p.page(2)

page1
>>> <Page 1 of 2>

# 第一页的对象列表
page1.object_list
>>> ['john', 'paul']

# 判断是否存在下一页
page1.has_next()
>>> True

page2.has_next()
>>> False

# 判断是否存在上一页
page2.has_previous()
>>> Trus

page1.has_previous()
>>> Flase

# 判断是否存在其他页
page1.has_other_pages()
>>> True

# 下一页的页码
page1.next_page_number()
>>> 2

# 如果下一页不存在,会报错
page2.next_page_number()
>>> Traceback (most recent call last):
...
raise EmptyPage('That page contains no results')

# 上一页页码
page2.previous_page_number()
>>> 1

# 某页对象索引
page2.start_index() # 第2页第一个对象的索引(从1开始)
>>> 3
page2.end_index() # The 1-based index of the last item on this page
>>> 4




分页器示例

现在我们在 view 中使用分页器:

from django.shortcuts import render
# 分页器,空白页,页面不存在三个模块
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myApp.models import Beatles 


def test(request):
    context = {}

    beatles_list = Beatles.objects.all()
    # 分页器,对 beatles_list 进行分页操作,每页显示2个对象
    paginator = Paginator(beatles_list, 2) 
    # get 方法获取页数
    page = request.GET.get('page')

    try: # 获取某页
        beatles_list = paginator.page(page)
    except PageNotAnInteger: # 如果 page 参数不为正整数,显示第一页
        beatles_list = paginator.page(1)
    except EmptyPage: # 如果 page 参数为空页,跳到最后一页
        beatles_list = paginator.page(paginator.num_pages)

    context['beatles_list'] = beatles_list

    return render(request, 'test.html', context)

浏览器打开:http://127.0.0.1:8000/test/?page=1 ,能看到第一页的,再打开:http://127.0.0.1:8000/test/?page=2 ,显示的就是第二页信息。

我们再编辑下前端,做一个上下页的按钮:

<body>
    {% for member in beatles_list  %}
        {{ member }}
        <br><br>
    {% endfor %}

    <br><br>
    {# 存在上一页 #}
    {% if beatles_list.has_previous %}
        <a href="?page={{ beatles_list.previous_page_number}}">上一页</a>
    {% endif %}

    {# 存在下一页 #}
    {% if beatles_list.has_next %}
        <a href="?page={{ beatles_list.next_page_number}}">下一页</a>
    {% endif %}
</body>




分页器对象

分页器参数

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
  • object_list: 要进行分页的对象,可以是列表、元组、QuerySet 或其他具有 count()__len__() 方法的对象。

  • per_page: 每一页的对象数量

  • orphans: 页面对象数量不得少于该数量。举个例子,有12个对象,每页显示5个,默认 orphans=0 的时候将会分成3页,第1第2页各有5个对象,第3页2个对象;当设置 orphans=2 时候,页面不能少于2个对象,这时对象会被分成2页,第1页有5个对象,第2页有7个对象。

  • allow_empty_first_page: 是否允许第一页为空

分页器属性:

  • Paginator.count: 所有页面的对象总数。

  • Paginator.num_pages:页面总数。

  • Paginator.page_range:页码的范围,返回一个 range 对象,从1开始。




Page 对象

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属性:

Page.object_list: 当前页上所有对象的列表。

Page.number: 当前页的序号,从1开始。

Page.paginator: 相关的Paginator对象。

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

推荐阅读更多精彩内容