一、自带分页,一些常用参数
注明函数中的paginator.page(current_page)
更多的使用在html页面,current_page
用来接收前端返回的页数值
-
import 引入
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-
负责后台处理的Paginator函数
paginator = Paginator(USER_LIST,10)
两个参数分别接收,数据库中的总条数,和每页显示多少条,其他的返回函数分别有:
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象(是否具有上一页,下一页)
-
用来处理前端的page,也是Paginator返回函数
用来判断是否具有上一页,下一页,因此接收的是,页面返回的页数
posts = paginator.page(current_page)
,页数有不确定性所以用异常处理做处理,常见的返回函数
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表
# number 当前页
# paginator paginator对象
-
代码案例
def index1(request):
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
current_page = request.GET.get('page')
paginator = Paginator(USER_LIST,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 EmptyPage:
posts = paginator.page(paginator.num_pages)
except PageNotAnInteger:
posts = paginator.page(1)
return render(request,'index1.html',{'posts':posts})
-
在前端处理的时候
可以在templates,目录下创建include文件夹,里面放置写好的分页前端的代码块,用{% include 'incldue/pager.html' %}调用部分代码
//是否有上一页
{% if posts.has_previous %}
<a href="/index1?page={{ posts.previous_page_number }}">上一页</a>
//没有上一页,不让点击
{% else %}
<a href="#">上一页</a>
{% endif %}
//是否有下一页
{% if posts.has_next%}
<a href="/index1?page={{ posts.next_page_number }}">下一页</a>
//没有下一页,不让点击
{% else %}
<a href="#">下一页</a>
{% endif %}
数据展示用的是has_previous
函数
<ul>
{% for i in posts %}
<li>{{ i }}</li>
{% endfor %}
</ul>
二、自定制
python 自带的分页,由于妻子输入你的功能缺陷,我们可以对其自定制,让页面展示底栏的页数,还可以进行跳转设置
-
原理
想要在html页面改变效果,就要对Paginator.page进行处理,为了避免在源码直接处理的尴尬,选着继承的方式,整体的思路如下:
#保证循环的次数在规定的展示栏个数,如果设置11,循环的次数保证在11次
class CustomPaginator(Paginator):
def __init__(self, current_page, per_pager_num,*args, **kwargs):
'''
:param current_page: 当前页
:param per_pager_num: 底边栏展示页数
'''
self.current_page = int(current_page)
self.per_pager_num = int(per_pager_num)
super(CustomPaginator, self).__init__(*args, **kwargs)
def page_num_range(self):
#总页数小于实际展示页
if self.num_pages < self.per_pager_num:
return range(1,self.num_pages+1)
#part 当前总展示栏中间点5
part = int(self.per_pager_num//2)
#最小页数为1防止出现负数情况
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)
跟上面的变动的位置
image.png
以后自定制是要调用我们写的函数
paginator = CustomPaginator(11,current_page,USER_LIST,10)
其中11是底栏最多展示条数 ,'current_page'当前页
-
前端显示
{% for i in posts.paginator.page_num_range%}
{% if i == posts.number %}
<a style="font-size: 30px" href="index1/?page={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1/?page={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
网友评论