产卵器

Django提供了一些类来帮助您管理分页数据——也就是说,通过“上一页/下一页”链接拆分的数据。这些班住在 django/core/paginator.py .

有关示例,请参见 Pagination topic guide

Paginator

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)[源代码]

paginator的行为就像一系列 Page 使用时 len() 或者直接迭代。

Paginator.object_list

必修的。列表,元组, 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 页号越大,所需时间越长的记录。

Paginator.per_page

必修的。页面上要包含的最大项数,不包括孤立项(请参见 orphans 以下是可选参数)。

Paginator.orphans

可选。当你不想最后一页只有很少的项目时使用这个。如果最后一页的项目数通常小于或等于 orphans 然后,这些项目将被添加到上一页(这将成为最后一页),而不是将项目单独留在一页上。例如,有23个项目, per_page=10orphans=3 有两页,第一页有10个项目,第二页(和最后一页)有13个项目。 orphans 默认为零,这意味着永远不会合并页面,最后一页可能有一个项目。

Paginator.allow_empty_first_page

可选。第一页是否允许为空。如果 Falseobject_list 是空的,然后是 EmptyPage 将引发错误。

Paginator.error_messages
New in Django 5.0.

这个 error_messages 参数允许您重写分页器将引发的默认消息。传入一个字典,其中的键与要重写的错误消息匹配。可用的错误消息键包括: invalid_pagemin_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

方法

Paginator.get_page(number)[源代码]

返回A Page 对象,同时处理超出范围和无效的页码。

如果页面不是数字,则返回第一页。如果页码为负数或大于页数,则返回最后一页。

提出一个 EmptyPage 仅当您指定 Paginator(..., allow_empty_first_page=False) 以及 object_list 是空的。

Paginator.page(number)[源代码]

返回一个 Page 具有给定的从1开始的索引的。加薪 PageNotAnInteger 如果 number 无法通过调用 int() 。加薪 EmptyPage 如果给定的页码不存在。

Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)[源代码]

返回从1开始的页码列表,类似于 Paginator.page_range ,但可以在当前页码的任一侧或两侧添加省略号 Paginator.num_pages 很大。

当前页码两边要包含的页数由 on_each_side 默认为3的参数。

在页面范围的开始和结束处包含的页数由 on_ends 默认为2的参数。

例如,使用的默认值为 on_each_sideon_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 如果给定的页码不存在。

属性

Paginator.ELLIPSIS

一种可翻译字符串,用作返回的页范围中被省略的页码的替代项 get_elided_page_range() . 默认是 '…' .

Paginator.count

所有页面上的对象总数。

备注

确定包含在 object_listPaginator 会先打电话吗 object_list.count() .如果 object_list 没有 count() 方法,然后 Paginator 会回到使用 len(object_list) . 这允许对象,例如 QuerySet ,使用更高效的 count() 方法(如果可用)。

Paginator.num_pages

总页数。

Paginator.page_range

基于1的页码范围迭代器,例如, [1, 2, 3, 4] .

Page

你通常不会建造 Page 对象的手-你可以通过迭代得到它们 Paginator 或通过使用 Paginator.page() .

class Page(object_list, number, paginator)[源代码]

一页就像一个序列 Page.object_list 使用时 len() 或者直接迭代。

方法

Page.has_next()[源代码]

返回 True 如果有下一页。

Page.has_previous()[源代码]

返回 True 如果有上一页。

Page.has_other_pages()[源代码]

返回 True 如果有下一个 or 上一页。

Page.next_page_number()[源代码]

返回下一个页码。加薪 InvalidPage 如果下一页不存在。

Page.previous_page_number()[源代码]

返回上一个页码。加薪 InvalidPage 如果上一页不存在。

Page.start_index()[源代码]

返回页面上第一个对象相对于分页器列表中所有对象的1基索引。例如,当将5个对象的列表分页为每页2个对象时,第二页的 start_index() 会回来 3 .

Page.end_index()[源代码]

返回页面上最后一个对象相对于分页器列表中所有对象的1基索引。例如,当将5个对象的列表分页为每页2个对象时,第二页的 end_index() 会回来 4 .

属性

Page.object_list

此页上的对象列表。

Page.number

此页基于1的页码。

Page.paginator

相关的 Paginator 对象。

例外情况

exception InvalidPage[源代码]

paginator传递无效页码时引发的异常的基类。

这个 Paginator.page() 方法在请求的页无效(即不是整数)或不包含对象时引发异常。一般来说,这足以抓住 InvalidPage 异常,但如果您想要更大的粒度,可以捕获以下任一异常:

exception PageNotAnInteger[源代码]

提出时 page() 给定的值不是整数。

exception EmptyPage[源代码]

提出时 page() 提供了一个有效值,但该页上不存在任何对象。

这两个异常都是 InvalidPage ,所以你可以用 except InvalidPage .