分页
定义
-
分页是指在web页面有大量数据需要显示,为了阅读方便在每个
页页中只显示部分数据。 -
优点:
-
方便阅读
-
减少数据提取量,减轻服务器压力。
-
-
Django提供了
Paginator
类可以方便的实现分页功能 -
Paginator类位于
django.core.paginator
模块中。
Paginator 对象
我们使用 paginatror 可以创建一个分类对象
from django.core.paginator import Paginator
paginator = Paginator(object_list, per_page)
- 参数:
- object_list 需要分类数据的对象列表
- per_page 每页数据个数
- 返回值
- Paginator 的对象
Paginator 属性
属性名 | 说明 |
---|---|
Paginator.count | 需要分页数据的对象总数 |
Paginator.num_pages | 分页后的页面总数 |
Paginator.page_range | 从1开始的 range 对象,用于记录当前页面的页码 |
Paginator.per_page | 每页数据的个数 |
Paginator方法 - page
我们可以使用 page 方法来细致的操作每一页上存储的数据
from django.core.paginator import Paginator
# 创建一个 paginator 对象
paginator = Paginator(object_list, per_page)
# 创建一个 Page 对象
page = paginator.page(number)
- 参数 number 为页码信息(从1开始)
- 如果当前的页码不存在就会抛出 InvalidPage 异常
- 返回当前 number 页对应的信息
page 对象的属性
我们的 page 对象也是有属性的,page也是一个对象
from django.core.paginator import Paginator
# 创建一个 paginator 对象
paginator = Paginator(object_list, per_page)
# 创建一个 Page 对象
page = paginator.page(number) # 这个 page 也是有自己的方法的
属性名 | 说明 |
---|---|
page.object_list | 当前页所有数据对象的列表 |
page.number | 当前页的序号,从1开始 |
page.paginator | 当前 page 对象相关的 paginator 对象 |
page 对象的方法
我们的 page 对象不但有很多的属性,同时有很多方法
方法名字 | 说明 |
---|---|
page.has_next() | 如果有下一页返回True |
page.has_previous() | 如果有上一页返回True |
page.has_other_pages() | 如果有上一页或下一页返回True |
page.next_page_number() | 返回下一页的页码 如果下一页不存在,拋出InvalidPage异常 |
page.previous_page_number() | 返回上一页的页码 如果上一页不存在抛出InvalidPage异常 |
实战
- 制作一个自己的分类标签页
- 前往视图函数写代码
from django.shortcuts import render
from django.core.paginator import Paginator
def test_paginator_views(request):
# 获取我们浏览器当前的页码,如果没有就默认给一个1
page_num = request.GET.get('page_num', 1)
# 创建我们希望显示的数据列表
data_list = ['新闻频道_央视网(cctv.com)',
'新闻 - 视频大全 - 高清在线观看',
'新闻中心首页_新浪网',
'新闻中心-腾讯网_腾讯新闻',
'新闻的最新相关信息',
'搜狐新闻-搜狐',
'网易新闻',
'新闻吧 - 百度贴吧',
'新闻(一种文体) - 百度百科',
"秒当百科"]
# 创建一个 paginator 实例,每一页显示 2 个数据
paginator = Paginator(data_list, 2)
# 创建一个页面控制对象
page = paginator.page(int(page_num))
return render(request, 'testp/testp.html',locals())
- 定义路由
# 子路由的 urls.py 文件内
from django.urls import path
from . import views
urlpatterns = [
path('testp',views.test_paginator_views,name='testp'),
]
主路由的 urls.py 请自行配置
- 编写模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>分页功能测试</title>
</head>
<body>
<!-- 先显示我们当前所有的数据 -->
{% for eachObject in page.object_list %}
<p>{{eachObject}}</p>
{% endfor %}
<!-- 显示我们分页的导航栏 -->
<!-- 先判断我们当前是否有上一页,如果没有上一页就无法点击 -->
{% if page.has_previous %}
<a href={% url "testp" %}?page_num={{page.previous_page_number}}>上一页</a>
{% else %}
上一页
{% endif %}
<!-- 显示我们的导航数字,当前数字是黑的其他数字都能点击 -->
{% for each_page in paginator.page_range %}
{% if each_page == page.number %}
{{each_page}}
{% else %}
<a href={% url "testp" %}?page_num={{each_page}}>{{each_page}}</a>
{% endif %}
{% endfor %}
<!-- 判断是否有下一页,是否能点击 -->
{% if page.has_next %}
<a href={% url "testp" %}?page_num={{page.next_page_number}}>下一页</a>
{% else %}
下一页
{% endif %}
</body>
</html>
- 查看效果