Django框架 Pagination分页实现代码实例
一、自定义分页
1、基础版自定义分页
data=[]
foriinrange(1,302):
tmp={"id":i,"name":"alex-{}".format(i)}
data.append(tmp)
print(data)
defuser_list(request):
#user_list=data[0:10]
#user_list=data[10:20]
try:
current_page=int(request.GET.get("page"))
exceptExceptionase:
current_page=1
per_page=10
#数据总条数
total_count=len(data)
#总页码
total_page,more=divmod(total_count,per_page)
ifmore:
total_page+=1
#页面最多显示多少个页码
max_show=11
half_show=int((max_show-1)/2)
ifcurrent_page<=half_show:
show_start=1
show_end=max_show
else:
ifcurrent_page+half_show>=total_page:
show_start=total_page-max_show
show_end=total_page
else:
show_start=current_page-half_show
show_end=current_page+half_show
#数据库中获取数据
data_start=(current_page-1)*per_page
data_end=current_page*per_page
user_list=data[data_start:data_end]
#生成页面上显示的页码
page_html_list=[]
#加首页
first_li='2、封装保存版
classPagination(object): def__init__(self,current_page,total_count,base_url,per_page=10,max_show=11): """ :paramcurrent_page:当前页 :paramtotal_count:数据库中数据总数 :paramper_page:每页显示多少条数据 :parammax_show:最多显示多少页 """ try: current_page=int(current_page) exceptExceptionase: current_page=1 self.current_page=current_page self.total_count=total_count self.base_url=base_url self.per_page=per_page self.max_show=max_show #总页码 total_page,more=divmod(total_count,per_page) ifmore: total_page+=1 half_show=int((max_show-1)/2) self.half_show=half_show self.total_page=total_page @property defstart(self): return(self.current_page-1)*self.per_page @property defend(self): returnself.current_page*self.per_page defpage_html(self): ifself.current_page<=self.half_show: show_start=1 show_end=self.max_show else: ifself.current_page+self.half_show>=self.total_page: show_start=self.total_page-self.max_show show_end=self.total_page else: show_start=self.current_page-self.half_show show_end=self.current_page+self.half_show #生成页面上显示的页码 page_html_list=[] #加首页 first_li='
3、封装保存版使用指南
defuser_list(request):
pager=Pagination(request.GET.get("page"),len(data),request.path_info)
user_list=data[pager.start:pager.end]
page_html=pager.page_html()
returnrender(request,"user_list.html",{"user_list":user_list,"page_html":page_html})
二、Django内置分页
1、内置分页view部分
fromdjango.shortcutsimportrender
fromdjango.core.paginatorimportPaginator,EmptyPage,PageNotAnInteger
L=[]
foriinrange(999):
L.append(i)
defindex(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当前页
#paginatorpaginator对象
exceptPageNotAnInteger:
posts=paginator.page(1)
exceptEmptyPage:
posts=paginator.page(paginator.num_pages)
returnrender(request,'index.html',{'posts':posts})
2、内置分页HTML部分
{%foriteminposts%}
- {{item}}
{%endfor%}{%ifposts.has_previous%} Previous {%endif%} Page{{posts.number}}of{{posts.paginator.num_pages}}. {%ifposts.has_next%} Next {%endif%}