django提供了一种可以用来进行分页的方法:
from django.core.paginator import Paginator as pa
test_objet = ['aa','bb','cc','dd','ee','ff','gg','hh','ii','jj','kk','ll']
test_1 = pa(test_objet,3)
for i in test_1.page(1):
print(i)
#print: aa,bb,cc
当数据量较大时候,看起来和想象中的不太一样:
看起来是有点太多了,对其进行优化:
class Pagination_p2(object):
def __init__(self,request,queryset,page_size=5,page_param='page',plus=3) -> None:
self.request = request
self.query = queryset
self.plus = plus
self.page_param = page_param
self.pagination = pa(queryset,page_size)
定义一个新的分页辅助类Pagination_p2。
request是前端返回的请求,queryset是从数据库中拿到的数据,plus是显示的页面数(就是当前页面+- plus),page_size为每一页中的数据数目。
之后定义函数,获取页面:
page = self.request.GET.get(self.page_param)
try:
now_pagination = self.pagination.page(page)
except PageNotAnInteger:
now_pagination = self.pagination.page(1)
except EmptyPage:
now_pagination = self.pagination.page(1)
如果page不合法,则返回到第一页
if self.pagination.count <= self.plus * 2 + 1:
now_pagination_list = now_pagination.paginator.page_range
else:
if now_pagination.number <= self.plus:
now_pagination_list = range(1,self.plus*2+1+1)
elif now_pagination.number >= self.pagination.num_pages - self.plus:
now_pagination_list = range(self.pagination.num_pages - self.plus * 2,self.pagination.num_pages + 1)
else:
now_pagination_list = range(now_pagination.number - self.plus,now_pagination.number + self.plus + 1)
当页面数不满足 page +- plus的分页需求时,则一直显示全部页面内容;
当页面数量少于 plus时 或 大于 最大值 - plus时,锁定显示页面数量;
通常情况显示为 (当前页面数 - plus,当前页面 + plus)
return (now_pagination,now_pagination_list)
返回量
page_object = Pagination_p2(request=request,queryset=queryset).html()
context = {
'now_pa' : page_object[0],
'pa_pn' : page_object[1]
}
视图view 中接受返回量。
templates中进行相关定义。
这样看起来就舒服得多了。