Python学习第163天(分页初步实现)
先说一下自行实现分页是如何进行的
USER_LIST=[]
# 1.类似于我们从数据库中查收到的所有数据
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp)
def index(req):
per_page_count =10
# 2.设定每页显示的信息的个数
current_page =req.GET.get('p')
# 3.通过前段获取当前所在页面的页码
current_page = int(current_page) # 此时获得的页码数据类型为字符串,需要进行格式转换
# p = 1
start = (current_page-1)*per_page_count
end = current_page*per_page_count
# 4.通过当前页信息获取本页显示的所有内容范围
data = USER_LIST[start:end]
# 5.通过内容标签的范围来确定本页显示内容,并将此数据返回给前段
prev_count = current_page-1
next_count = current_page+1
# 6.上一页和下一页就是通过将p值减一或加一,然后刷新页面重新提交
return render(req,'index.html',{'user_list':data,'next_page':next_count,'prev_page':prev_count})
然后是关于Django自带的分页内容,这里主要集中了两个类,分别是Paginator、Page
Paginator可以通过内置的page方法生成Page对象,反之Page类也可以这样操作
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') paginator = Paginator(L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', {'posts': posts}) views.py
下面说一下Django存在的不足,我们常见的翻页中都应该如下图
变大的是当前页面,左右各有几个数字然后是上一页,和下一页
下面我们需要对Paginator进行一定的修改,所以我们可以重新写一个类,继承Paginator所有的方法,再增加新的方法用于实现显示数字的功能
class CustomPaginator(Paginator): def __init__(self,current_page,per_page_num,*args,**kwargs): # 当年页码 self.current_page = int(current_page) # 最多显示页码的个数 self.per_page_num = int(per_page_num) super(CustomPaginator,self).__init__(*args,**kwargs) def pager_num_range(self): # self.num_pages 表示总共有多少页 # 情况1:当总页数小于我们要显示的页码个数 if self.num_pages<self.per_page_num: return range(1,self.num_pages+1) part = int(self.per_page_num/2) # 情况2:我们需要显示10个页码,但是此时当前页为第2页,依旧显示1-10 if self.current_page<=part: return range(1,self.per_page_num+1) # 情况3:我们需要显示10个页码,共有20页,但是此时当前页为第18页,依旧显示11-20 if (self.current_page+part)>self.num_pages: return range(self.num_pages-self.per_page_num,self.num_pages+1) # 情况4:正常的中间情况 return range(self.current_page-part,self.current_page+part+1)
def index1(req):
#内置的很多数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象(封装是否有下一页和上一页,如果有,就会得到下一页的页码
current_page = req.GET.get('p')
paginator = CustomPaginator(current_page,9,USER_LIST,10)
# Django自带的分页方法,传递USER_LIST即为所有的数据,
# 如果是使用数据库操作就可以直接写modles.Stundets.objuct.all()即可
try:
posts = paginator.page(current_page)
# posts 就是一个page对象
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经完成切片的数据
# number 当前页
# paginator paginator对象(使之可以与Paginator对象可以进行相互转换)
except PageNotAnInteger:# 所输入的数据不是页码的情况
posts = paginator.page(1)
except EmptyPage: # 所输入的页码超过页码范围
posts = paginator.page(paginator.num_pages)
return render(req,'index1.html',{'posts':posts})
然后是对应的前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for row in posts.object_list %} <li>{{ row.name }}*{{ row.age }}</li> {% endfor %} </ul> {% include 'include/pager.html' %} {% if posts.has_previous %} <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a> {# {% else %}#} {# <a href="#">上一页</a>#} {% endif %} {% for i in posts.paginator.pager_num_range %} {% if i == posts.number %} <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a> {% else %} <a href="/index1.html?p={{ i }}">{{ i }}</a> {% endif %} {% endfor %} {% if posts.has_next %} <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="">下一页</a> {% endif %} <span> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </html>
以上就是关于分页的所有内容。