Django提供了一些类来帮助您管理分页数据——也就是说,通过“上一页/下一页”链接拆分的数据。这些班住在 django/core/paginator.py .
有关示例,请参见 Pagination topic guide 。
Paginator
类¶paginator的行为就像一系列 Page
使用时 len()
或者直接迭代。
必修的。列表,元组, QuerySet
或具有 count()
或 __len__()
方法。为了一致的分页, QuerySet
应订购S,例如 order_by()
条款或违约 ordering
模型上。
性能问题大 QuerySet
的S
如果你用的是 QuerySet
with a very large number of items, requesting high page numbers might be slow on some databases, because the resulting LIMIT
/OFFSET
查询需要计数 OFFSET
页号越大,所需时间越长的记录。
可选。当你不想最后一页只有很少的项目时使用这个。如果最后一页的项目数通常小于或等于 orphans
然后,这些项目将被添加到上一页(这将成为最后一页),而不是将项目单独留在一页上。例如,有23个项目, per_page=10
和 orphans=3
有两页,第一页有10个项目,第二页(和最后一页)有13个项目。 orphans
默认为零,这意味着永远不会合并页面,最后一页可能有一个项目。
可选。第一页是否允许为空。如果 False
和 object_list
是空的,然后是 EmptyPage
将引发错误。
这个 error_messages
参数允许您重写分页器将引发的默认消息。传入一个字典,其中的键与要重写的错误消息匹配。可用的错误消息键包括: invalid_page
, min_page
,以及 no_results
。
例如,以下是默认错误消息:
>>> from django.core.paginator import Paginator
>>> paginator = Paginator([1, 2, 3], 2)
>>> paginator.page(5)
Traceback (most recent call last):
...
EmptyPage: That page contains no results
下面是一条定制的错误消息:
>>> paginator = Paginator(
... [1, 2, 3],
... 2,
... error_messages={"no_results": "Page does not exist"},
... )
>>> paginator.page(5)
Traceback (most recent call last):
...
EmptyPage: Page does not exist
返回A Page
对象,同时处理超出范围和无效的页码。
如果页面不是数字,则返回第一页。如果页码为负数或大于页数,则返回最后一页。
提出一个 EmptyPage
仅当您指定 Paginator(..., allow_empty_first_page=False)
以及 object_list
是空的。
返回一个 Page
具有给定的从1开始的索引的。加薪 PageNotAnInteger
如果 number
无法通过调用 int()
。加薪 EmptyPage
如果给定的页码不存在。
返回从1开始的页码列表,类似于 Paginator.page_range
,但可以在当前页码的任一侧或两侧添加省略号 Paginator.num_pages
很大。
当前页码两边要包含的页数由 on_each_side
默认为3的参数。
在页面范围的开始和结束处包含的页数由 on_ends
默认为2的参数。
例如,使用的默认值为 on_each_side
和 on_ends
,如果当前页面为10且有50个页面,则页面范围将为 [1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]
。这将导致当前页面左侧的第7、8和9页,以及当前页面右侧的11、12和13页,以及开头的第1页和第2页以及末尾的第49页和第50页。
加薪 InvalidPage
如果给定的页码不存在。
一种可翻译字符串,用作返回的页范围中被省略的页码的替代项 get_elided_page_range()
. 默认是 '…'
.
所有页面上的对象总数。
备注
确定包含在 object_list
, Paginator
会先打电话吗 object_list.count()
.如果 object_list
没有 count()
方法,然后 Paginator
会回到使用 len(object_list)
. 这允许对象,例如 QuerySet
,使用更高效的 count()
方法(如果可用)。
总页数。
基于1的页码范围迭代器,例如, [1, 2, 3, 4]
.
Page
类¶你通常不会建造 Page
对象的手-你可以通过迭代得到它们 Paginator
或通过使用 Paginator.page()
.
一页就像一个序列 Page.object_list
使用时 len()
或者直接迭代。
返回下一个页码。加薪 InvalidPage
如果下一页不存在。
返回上一个页码。加薪 InvalidPage
如果上一页不存在。
返回页面上第一个对象相对于分页器列表中所有对象的1基索引。例如,当将5个对象的列表分页为每页2个对象时,第二页的 start_index()
会回来 3
.
返回页面上最后一个对象相对于分页器列表中所有对象的1基索引。例如,当将5个对象的列表分页为每页2个对象时,第二页的 end_index()
会回来 4
.
此页上的对象列表。
此页基于1的页码。
这个 Paginator.page()
方法在请求的页无效(即不是整数)或不包含对象时引发异常。一般来说,这足以抓住 InvalidPage
异常,但如果您想要更大的粒度,可以捕获以下任一异常:
这两个异常都是 InvalidPage
,所以你可以用 except InvalidPage
.
12月 18, 2023