写在前面
随着自己写的博客日益增加,博客列表页的展示也逐渐变得有些力不从心。要浏览所有的博客就不得不疯狂的滑鼠标。冗长的页面带来的体验十分的差劲。这个时候不得不将他们做一下简单分页处理。分页的方式有很多,而便捷的 Django 为我们准备了十分友好的类 Paginator
来帮助我们进行分页。
Paginator 对象
先看看源码中的初始化或者说构造方法:
1 | class Paginator: |
显然,要创建一个 Paginator 对象, 就不得不提供 object_list 和 per_page 对象。
object_list
A list, tuple, QuerySet, or other sliceable object with a count() or len() method. For consistent pagination, QuerySets should be ordered, e.g. with an order_by() clause or with a default ordering on the model.
从这段文档说明中,可以大致了解 object_list 是个这样的对象:列表、元组、QuerySet…同时,文档建议如果是 QuerySet 对象的话,应当对其进行排序,如使用 order_by() 方法,或者采用模型中默认的排序方法。
per_page
The maximum number of items to include on a page, not including orphans (see the orphans optional argument below).
显然,per_page 指的是每页要展示的选项最大个数。例如:每页显示 5 篇文章,那么就是 per_page=5
。同时也强调,不包括 orphans。
orphans
Use this when you don’t want to have a last page with very few items. If the last page would normally have a number of items less than or equal to orphans, then those items will be added to the previous page (which becomes the last page) instead of leaving the items on a page by themselves. For example, with 23 items, per_page=10, and orphans=3, there will be two pages; the first page with 10 items and the second (and last) page with 13 items. orphans defaults to zero, which means pages are never combined and the last page may have one item.
orphans 顾名思义就是孤儿的意思。通俗来讲就是,在分页时,发现最后一页可能就只有一两个选项去了,如果觉得最后一页只是很少一部分,不想单独占一页,那么就可以将其添加在前一页中。而 orphans 值恰恰就是这样一个阈值,当小于它时,就可以将剩下那部分加到前一页中。假设我们有 23 个选项,每页展示是个选项,那么最多可以分成 3 页,第三页就只有 3 个选项。如果我们设置 orphans 大于等于 3,那么第一页是 10,第二页是 13 了。
如何使用
文档中给出了一个十分详细的例子供我们参考:
在我们的视图 views.py 中:
1 | from django.core.paginator import Paginator |
在我们的模板 list.html 中:
1 | {% for contact in contacts %} |
一点点注释:
has_previous() 判断是否有上一页 has_next() 判断是否有上一页 previous_page_number() 返回上一个页码 contacts.number 一个基于 1 的页码 paginator.num_pages() 页码的基于 1 的范围迭代器
获取更多可以参考 官方文档