Paginator基础知识:
说明:为了方便,这部分我没有使用QuerySet做数据源,而是用一个列表做数据源
from django.core.paginator import Paginator
#假设下面的列表就是我们要分页的数据,我们希望每页显示3个名字
source=['黑沼爽子','风早翔太','碓氷拓海','玖兰枢','锥生零','入江直树']
#实例化Paginator,两个参数分别是要分页的数据,以及每页希望显示多少条数据
p=Paginator(source,3)
#用Paginator对象的get_page方法获得第一页的page对象,参数是页码
page1=p.get_page(1)
#用同样的方法获得第二页的page对象
page2=p.get_page(2)
#遍历第一页的page对象,获取第一页会显示的全部数据并打印出来
print('下面是第一页要显示的3条数据:')
for data in page1:
print(data)
#通过一个page对象获取它的页码并打印出来
print('page2的页码是',page2.number)
#通过一个page对象获取本次分页的总页数
print('总页数是',page1.paginator.num_pages)
#通过一个page对象获取一个可迭代的所有页码对象(这个对象从1开始,使用起来非常方便)
print('可迭代的页码对象',page1.paginator.page_range)
终端:
下面是第一页要显示的3条数据:
黑沼爽子
风早翔太
碓氷拓海
page2的页码是 2
总页数是 2
可迭代的页码对象 range(1, 3)
基础应用实例:
urls.py
from django.urls import re_path
from . import views
urlpatterns=[
#路由里的\d+用于接收一个数字,这个数字就是页码
re_path(r'^studentpage/(\d+)/$',views.studentpage),
]
views.py
from django.shortcuts import render
from .models import Students
from django.core.paginator import Paginator
def studentpage(request,pageid):
'''这是管理学生信息分页的视图'''
#取出全部学生数据
allStudentsList=Students.stuObj.all()
#把全部学生分页,每页显示两条数据,生成了一个分页器的实例
paginator=Paginator(allStudentsList,2)
#根据url里的pageid拿到对应的那一页的数据,这个pageid就是我们配路由的时候写的\d+接收到的整数
#currentPageList是一个page对象,它不仅包含了这一页需要显示的学生信息,还有这一页的页码,而且可以通过它找到总页数
currentPageList=paginator.page(pageid)
#把currentPageList传给模板
return render(request,'myapp/studentpage.html',{'currentPageList':currentPageList})
studentpage.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>分页显示学生</title>
<style>
#pages li{
float:left;
list-style: none;
width:20px;
margin:5px;
text-align: center;
}
a{
text-decoration: none;
}
/* 下面这个类的作用就在于设置背景颜色 */
.active{
background-color: aqua;
}
</style>
</head>
<body>
<ul>
<!-- 遍历当前页的page对象,展示出当前页需要展示的学生姓名和简介 -->
{%for student in currentPageList%}
<li>{{student.sname}}--{{student.sinfo}}</li>
{%endfor%}
</ul>
<ul id='pages'>
<!-- 遍历页码迭代器,生成下方的页码列表 -->
{%for index in currentPageList.paginator.page_range%}
<!-- 如果页码列表里的一个数字正好和当前展示的这个page对象的页码一样,那么就让这个数字归为active类,也就是给它添加背景颜色。这样我们就能一眼看出我们现在处于哪一页。并且因为我们就处于这一页,所以这个数字不需要链接。 -->
{%if index == currentPageList.number%}
<li class='active'>{{index}}</li>
<!-- 其他页码需要链接,不需要背景颜色 -->
{%else%}
<li><a href="/studentpage/{{index}}/">{{index}}</a></li>
{%endif%}
{%endfor%}
</ul>
</body>
</html>
效果图: