1 Paginator
Paginator 类的作用是将我们需要分页的数据分割成若干份。当我们实现化一个 Paginator
类的实例时,需要给 Paginator
传入两个参数。第一个参数是数据源,可以是一个列表、元组、以及查询结果集 QuerySet
。第二个参数需要传入一个整数,表示每页显示数据条数。具体写法如下:
book_list = []
for x in range(1, 26): # 一共 25 本书
book_list.append('Book ' + str(x))
# 将数据按照规定每页显示 10 条, 进行分割
paginator = Paginator(book_list, 10)
上面代码中,我们传入一个名为 book_list
的列表,该列表中含有 25 本书,然后我们给 Paginator
设定每页显示 10 条数据,最后得到一个 Paginator 实例。
另外 Paginator
类中有三个常用的属性,它们分别是:
- count:表示所有页面的对象总数。
- num_pages: 表示页面总数。
- page_range: 下标从 1 开始的页数范围迭代器。
2 Page 对象
Paginator
类提供一个page(number)
函数,该函数返回就是一个 Page
对象。参数 number 表示第几个分页。如果 number = 1
,那么 page()
返回的对象是第一分页的 Page
对象。在前端页面中显示数据,我们主要的操作都是基于 Page
对象。具体用法如下:
# 使用 paginator 对象返回第 1 页的 page 对象
books = paginator.page(1)
Page对象有三个常用的属性:
- object_list: 表示当前页面上所有对象的列表。
- number: 表示当前页的序号,从 1 开始计数。
- paginator: 当前
Page
对象所属的Paginator
对象。
除此之外,Page 对象还拥有几个常用的函数:
- has_next(): 判断是否还有下一页,有的话返回True。
- has_previous():判断是否还有上一页,有的话返回 True。
- has_other_pages():判断是否上一页或下一页,有的话返回True。
- next_page_number(): 返回下一页的页码。如果下一页不存在,抛出InvalidPage 异常。
- previous_page_number():返回上一页的页码。如果上一页不存在,抛出InvalidPage 异常。
3 案例
3.1、views.py
用数组模拟数据
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.core.paginator import Paginator
from django.shortcuts import render
def test_page(request):
page_num = request.GET.get('page',1)
all_data = ['a','c','b','d','g','h']
#初始化paginator
paginator = Paginator(all_data,2)
#初始化具体页码page对象
c_page = paginator.page(int(page_num))
return render(request,'test_page.html',locals())
3.2、test_page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
</head>
<body>
{% for p in c_page %}
<p>
{{ p }}
</p>
{% endfor %}
{#上一页#}
{% if c_page.has_previous %}
<a href="/test_page?page={{ c_page.previous_page_number }}">上一页</a>
{% endif %}
{#页码部分#}
{% for p_num in paginator.page_range %}
{% if p_num == c_page.number %}
{{ p_num }}
{% else %}
<a href="/test_page?page={{ p_num }}">{{ p_num }}</a>
{% endif %}
{% endfor %}
{#下一页#}
{% if c_page.has_next %}
<a href="/test_page?page={{ c_page.next_page_number }}">下一页</a>
{% endif %}
</body>
</html>
不要忘记配置路由
path('test_page', views.test_page),