Django 自定义分页器的实现代码
为什么要实现分页?
在大部分网站中分页的功能都是必要的,尤其是在后台管理中分页更是不可或缺
分页能带给用户更好的体验,也能减轻服务器的压力
对于分页来说,有许多方法都可以实现
例如把数据全部读取出来在前端用javascript实现,但这样一次请求全部数据服务器压力很大,
还有就是在后端实现,每一次请求部分数据显示
分页需求:
1.每页显示的多少条数据
2.页面显示多少个页码
3.上一页和下一页
4.首页和尾页
效果演示:
代码实现:
分页类封装:
在我的app下创建一个page.py文件,进行封装,我是先在我的app下创建了一个utils文件再创建page.py
classPagination(object):
def__init__(self,current_page_num,all_count,request,per_page_num=10,pager_count=11):
"""
封装分页相关数据
:paramcurrent_page_num:当前访问页的数字
:paramall_count:分页数据中的数据总条数
:paramper_page_num:每页显示的数据条数
:parampager_count:最多显示的页码个数
"""
try:
current_page_num=int(current_page_num)
exceptExceptionase:
current_page_num=1
ifcurrent_page_num<1:
current_page_num=1
self.current_page_num=current_page_num
self.all_count=all_count
self.per_page_num=per_page_num
#实际总页码
all_pager,tmp=divmod(all_count,per_page_num)
iftmp:
all_pager+=1
self.all_pager=all_pager
self.pager_count=pager_count
self.pager_count_half=int((pager_count-1)/2)#5
#保存搜索条件
importcopy
self.params=copy.deepcopy(request.GET)#{"a":"1","b":"2"}
#开始
@property
defstart(self):
return(self.current_page_num-1)*self.per_page_num
#结束
@property
defend(self):
returnself.current_page_num*self.per_page_num
#实现
defpage_html(self):
#如果总页码<11个:
ifself.all_pager<=self.pager_count:
pager_start=1
pager_end=self.all_pager+1
#总页码>11
else:
#当前页如果<=页面上最多显示11/2个页码
ifself.current_page_num<=self.pager_count_half:
pager_start=1
pager_end=self.pager_count+1
#当前页大于5
else:
#页码翻到最后
if(self.current_page_num+self.pager_count_half)>self.all_pager:
pager_start=self.all_pager-self.pager_count+1
pager_end=self.all_pager+1
else:
pager_start=self.current_page_num-self.pager_count_half
pager_end=self.current_page_num+self.pager_count_half+1
page_html_list=[]
first_page='在视图中使用
views.py
#首先导入包
frommyapp.utils.pageimportPagination
frommyapp.modelsimportUser
defindex(request):
#queryset
user_list=User.objects.all()
#总页数
page_count=user_list.count()
#当前页
current_page_num=request.GET.get("page")
pagination=Pagination(current_page_num,page_count,request,per_page_num=1)
#处理之后的数据
user_list=user_list[pagination.start:pagination.end]
content={
"user_list":user_list,
"pagination":pagination,
}
returnrender(request,"user_list.html",content)
页面显示
user_list.html
index {%foruserinuser_list%} name {%endfor%} {{user.name}} {{pagination.page_html|safe}}