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%}