盒子
盒子
文章目录
  1. 写在前面
  2. Paginator 对象
  3. 如何使用
  4. 欢迎参观

Django中的分页

写在前面

随着自己写的博客日益增加,博客列表页的展示也逐渐变得有些力不从心。要浏览所有的博客就不得不疯狂的滑鼠标。冗长的页面带来的体验十分的差劲。这个时候不得不将他们做一下简单分页处理。分页的方式有很多,而便捷的 Django 为我们准备了十分友好的类 Paginator 来帮助我们进行分页。


Paginator 对象

先看看源码中的初始化或者说构造方法:

1
2
3
4
5
6
7
class Paginator:
def __init__(self, object_list, per_page, orphans=0,allow_empty_first_page=True):
self.object_list = object_list
self._check_object_list_is_ordered()
self.per_page = int(per_page)
self.orphans = int(orphans)
self.allow_empty_first_page = allow_empty_first_page

显然,要创建一个 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
2
3
4
5
6
7
8
9
from django.core.paginator import Paginator
from django.shortcuts import render

def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get('page')
contacts = paginator.get_page(page)
return render(request, 'list.html', {'contacts': contacts})

在我们的模板 list.html 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% for contact in contacts %}
{# Each "contact" is a Contact model object. #}
{{ contact.full_name|upper }}<br>
...
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if contacts.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ contacts.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
</span>
{% if contacts.has_next %}
<a href="?page={{ contacts.next_page_number }}">next</a>
<a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>

一点点注释:

has_previous() 判断是否有上一页
has_next() 判断是否有上一页
previous_page_number() 返回上一个页码
contacts.number 一个基于 1 的页码
paginator.num_pages() 页码的基于 1 的范围迭代器

获取更多可以参考 官方文档


欢迎参观

学Django时,顺便写了简单的个人博客。前端用的bootstrap框架。笔记都会同步的。

支持一下
  • 微信扫一扫
  • 支付宝扫一扫