Django 提供了一些类来帮助你管理分页数据 ——也就是说,数据被分割在几个页面上,并带有 “上一页/下一页” 的链接。这些类位于 django/core/paginator.py 中。
Paginator 类¶Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)¶当使用 len() 或直接迭代时,分页器的作用就像一个 Page 的序列。
增加了对 Paginator 迭代的支持。
Paginator.object_list¶必要的。一个列表、元组、QuerySet 或其他具有 count() 或 __len__() 方法的可切片对象。为了实现一致的分页,QuerySet 应该是有序的,例如使用 order_by() 子句或使用模型上的默认 ordering。
对大型 QuerySet 进行分页的性能问题
如果你使用的 QuerySet 有非常多的项目,在某些数据库上请求高页数可能会很慢,因为产生的 LIMIT / OFFSET 查询需要计算 OFFSET 记录的数量,随着页数的增加,需要的时间也就越长。
Paginator.orphans¶可选的。当你不希望最后一页的项目数量很少时,使用这个选项。如果最后一页的项目数量通常小于或等于 orphans,那么这些项目将被添加到前一页(成为最后一页),而不是让这些项目单独留在一页上。例如,如果有 23 个条目,per_page=10,orphans=3,则会有两页;第一页有 10 个条目,第二页(也是最后一页)有 13 个条目。orphans 默认为 0,这意味着页面永远不会合并,最后一页可能只有一个项目。
Paginator.allow_empty_first_page¶可选的。是否允许第一页为空。 如果 False 并且 object_list 是空的,则会出现 EmptyPage 错误。
Page 类¶你通常不会手工构建 Page 对象 —— 你将通过迭代 Paginator,或使用 Paginator.page() 获得它们。
Page(object_list, number, paginator)¶当使用 len() 或直接迭代时,一个页面就像一个 Page.object_list 的序列。
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 的索引。例如,当对一个有 5 个对象的列表进行分页时,每页有 2 个对象,第二页的 start_index() 将返回 3。
Page.end_index()¶返回页面上最后一个对象相对于分页器列表中所有对象的基于 1 的索引。例如,当对一个有 5 个对象的列表进行分页时,每页有 2 个对象,第二页的 end_index() 将返回 4。
InvalidPage¶当分页器被传递一个无效的页码时引发异常的基类。
Paginator.page() 方法在请求的页面无效(即不是整数)或不包含任何对象时引发异常。一般来说,只要捕获 InvalidPage 异常就够了,但如果你想要更细化,你可以捕获以下任何一种异常。
这两个异常都是 InvalidPage 的子类,所以你可以用 except InvalidPage 处理这两个异常。
3月 04, 2021