分页组件
分页组件
Django内置分页
Django为我们提供了一个paginator分页工具,示例如下:
views文件中
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
UESR_LIST=[]
for i in range(1,99):
temp={'name':'root'+str(i),'age':i}
UESR_LIST.append(temp)
def index1(request):
current_page = request.GET.get('p')
current_page = int(current_page)
paginator=paginator(UESR_LIST,10)#每页显示10条
#count:所有页面的对象总数
#num_pages:页面总数
#page_rangeL基于1的页数范围迭代器
try:
# Page对象
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,'index1.html',{'posts':posts})
在index1模板中,实现要显示的的页数
<ul>
{% for row in posts %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% if posts.has_previous %}#如果有上一页就显示
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% endif %}
{% if posts.has_next %}#如果有下一页就显示
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% endif %}
<span>{{ posts.number }}/{{ posts.paginator.num_pages }}
</span>
扩展Django的内置分页
扩展paginator分页工具,实现页数显示的优化
views.py
#定义一个新类,继承原来的Paginator对象
class CustomPaginator(Paginator):
def __init__(self,current_page,per_pager_num,*args,**kwargs):
self.current_page=int(current_page)
self.per_pager_num=int(per_pager_num)
super(CustomPaginator,self).__init__(*args,**kwargs)
def pager_num_range(self):
if self.num_pages<self.per_pager_num:
#页面总数少于每页分页数,则只应该显示到页面总数
return range(1,self.num_pages+1)
part=int(self.per_pager_num/2)
#使当前页的页码所处位置为中间
if self.current_page<=part:
return range(1,self.per_pager_num+1)
if(self.current_page+part)>self.num_pages:
return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
#在index1函数中,只需将语句paginator=paginator(UESR_LIST,10)换成
paginator=CustomPaginator(current_page,7,UESR_LIST,10)即可
在index1模板中,在上一页下一页中间加入页数模板
{% for i in posts.paginator.pager_num_range %}
{% if i == posts.number %}
<a style="font-size: 30px" href="/index1.html?p={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1.html?p={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
自定义分页
由于框架之间并不是所有的内置函数实现的功能都一样,如果我们可以自制分页,那么就可以再不同的框架之间使用,从而满足我们的需求
新建一个py文件,定义一个新的类
class Pagination(object):
def __init__(self,totalCount,currentPage,perPageNum=30,maxPageNum=7):
#总共的数目
self.total_count=totalCount
try:
#当前页数
self.current_page=int(currentPage)
except:
self.current_page=1
#每一页显示的数目
self.per_page_num=perPageNum
#显示的页码数
self.max_page_num=maxPageNum
def start(self):
return (self.current_page-1)*self.per_page_num
def end(self):
return self.current_page*self.per_page_num
@property
def num_pages(self):
'''
总页数
'''
a,b=divmod(self.total_count,self.per_page_num)#a为商,b为余数
if b==0:
return a
return a+1
def pager_num_range(self):
if self.num_pages<self.per_page_num:
#页面总数少于每页分页数,则只应该显示到页面总数
return range(1,self.num_pages+1)
part=int(self.max_page_num/2)
#使当前页的页码所处位置为中间
if self.current_page<=part:
return range(1,self.max_page_num+1)
if(self.current_page+part)>self.num_pages:
return range(self.num_pages-self.max_page_num+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
在view文件中,导入新建的类
def index2(request):
from app01.pager import Pagination
current_range=request.GET.get('p')
page_obj=Pagination(666,current_range)
data_List=UESR_LIST[page_obj.start():page_obj.end()]
return render(request,'index2.html',{'data':data_List,'page_obj':page_obj})
渲染
<ul>
{% for row in data %}
<li>{{ row.name }}-{{ row.age }}</li>
{% endfor %}
</ul>
{% for i in page_obj.pager_num_range %}
<a href="/index2.html?p={{ i }}">{{ i }}</a>
{% endfor %}

浙公网安备 33010602011771号