这篇文章将为大家详细讲解有关Django怎么实现翻页,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、views模块导入Paginator类实现数据分页

ApiTest/apiviews.py

每行都加了注释,希望有助于理解。

fromdjango.shortcutsimportrenderfromApiTest.modelsimportApiTestfromdjango.contrib.auth.decoratorsimportlogin_requiredfromdjango.core.paginatorimportPaginator,EmptyPage,PageNotAnInteger,InvalidPage@login_requireddefapi_test_manage(request):username=request.session.get('user','')#获取所有接口测试数据apitest_list=ApiTest.objects.all().order_by('id')#生成Paginator对象对数据分页,每页显示10条数据paginator=Paginator(apitest_list,10)#使用request.GET.get()函数获取url中的page参数的数值。默认第1页page=request.GET.get('page',1)#把获取的当前页码数转换成整数类型current_page=int(page)try:#获取查询页数的接口数据列表,page()函数会判断page实参是否是有效数字。page()函数源码附在文章的最后apitest_list=paginator.page(page)exceptPageNotAnInteger:apitest_list=paginator.page(1)except(EmptyPage,InvalidPage):#paginator.num_pagesapitest_list=paginator.page(paginator.num_pages)returnrender(request,"apitest_manage.html",{'user':username,'apitests':apitest_list})二、将views的数据渲染到前端模板上

在对应的html文件中加入此段代码即可。

<divclass="container"><ulclass="pagination"id="pager">{#上一页链接#}{%ifapitests.has_previous%}<liclass="previous"><ahref="/apitest_manage/?page={{apitests.previous_page_number}}"rel="externalnofollow">上一页</a></li>{%else%}<liclass="previousdisabled"><ahref="#"rel="externalnofollow"rel="externalnofollow">上一页</a></li>{%endif%}{#中间数字显示#}{%fornuminapitests.paginator.page_range%}{%ifnum==currentPage%}<liclass="itemactive"><ahref="/apitest_manage/?page={{num}}"rel="externalnofollow"rel="externalnofollow">{{num}}</a></li>{%else%}<liclass="item"><ahref="/apitest_manage/?page={{num}}"rel="externalnofollow"rel="externalnofollow">{{num}}</a></li>{%endif%}{%endfor%}{#下一页链接#}{%ifapitests.has_next%}{#如果有下一页,则正常显示下一页链接#}<liclass="next"><ahref="/apitest_manage/?page={{apitests.next_page_number}}"rel="externalnofollow">下一页</a></li>{%else%}<liclass="nextdisabled"><ahref="#"rel="externalnofollow"rel="externalnofollow">下一页</a></li>{%endif%}</ul></div>三、效果展示

四、Paginator类源码

此类主要用在views文件

classPaginator:def__init__(self,object_list,per_page,orphans=0,allow_empty_first_page=True):self.object_list=object_listself._check_object_list_is_ordered()self.per_page=int(per_page)self.orphans=int(orphans)self.allow_empty_first_page=allow_empty_first_pagedefvalidate_number(self,number):"""Validatethegiven1-basedpagenumber."""try:ifisinstance(number,float)andnotnumber.is_integer():raiseValueErrornumber=int(number)except(TypeError,ValueError):raisePageNotAnInteger(_('Thatpagenumberisnotaninteger'))ifnumber<1:raiseEmptyPage(_('Thatpagenumberislessthan1'))ifnumber>self.num_pages:ifnumber==1andself.allow_empty_first_page:passelse:raiseEmptyPage(_('Thatpagecontainsnoresults'))returnnumberdefget_page(self,number):"""Returnavalidpage,evenifthepageargumentisn'tanumberorisn'tinrange."""try:number=self.validate_number(number)exceptPageNotAnInteger:number=1exceptEmptyPage:number=self.num_pagesreturnself.page(number)defpage(self,number):"""ReturnaPageobjectforthegiven1-basedpagenumber."""number=self.validate_number(number)bottom=(number-1)*self.per_pagetop=bottom+self.per_pageiftop+self.orphans>=self.count:top=self.countreturnself._get_page(self.object_list[bottom:top],number,self)def_get_page(self,*args,**kwargs):"""Returnaninstanceofasinglepage.Thishookcanbeusedbysubclassestouseanalternativetothestandard:cls:`Page`object."""returnPage(*args,**kwargs)@cached_propertydefcount(self):"""Returnthetotalnumberofobjects,acrossallpages."""c=getattr(self.object_list,'count',None)ifcallable(c)andnotinspect.isbuiltin(c)andmethod_has_no_args(c):returnc()returnlen(self.object_list)@cached_propertydefnum_pages(self):"""Returnthetotalnumberofpages."""ifself.count==0andnotself.allow_empty_first_page:return0hits=max(1,self.count-self.orphans)returnceil(hits/self.per_page)@propertydefpage_range(self):"""Returna1-basedrangeofpagesforiteratingthroughwithinatemplateforloop."""returnrange(1,self.num_pages+1)def_check_object_list_is_ordered(self):"""Warnifself.object_listisunordered(typicallyaQuerySet)."""ordered=getattr(self.object_list,'ordered',None)iforderedisnotNoneandnotordered:obj_list_repr=('{}{}'.format(self.object_list.model,self.object_list.__class__.__name__)ifhasattr(self.object_list,'model')else'{!r}'.format(self.object_list))warnings.warn('Paginationmayyieldinconsistentresultswithanunordered''object_list:{}.'.format(obj_list_repr),UnorderedObjectListWarning,stacklevel=3)五、Page类源码

此类主要用在html文件

classPage(collections.abc.Sequence):def__init__(self,object_list,number,paginator):self.object_list=object_listself.number=numberself.paginator=paginatordef__repr__(self):return'<Page%sof%s>'%(self.number,self.paginator.num_pages)def__len__(self):returnlen(self.object_list)def__getitem__(self,index):ifnotisinstance(index,(int,slice)):raiseTypeError('Pageindicesmustbeintegersorslices,not%s.'%type(index).__name__)#Theobject_listisconvertedtoalistsothatifitwasaQuerySet#itwon'tbeadatabasehitper__getitem__.ifnotisinstance(self.object_list,list):self.object_list=list(self.object_list)returnself.object_list[index]defhas_next(self):returnself.number<self.paginator.num_pagesdefhas_previous(self):returnself.number>1defhas_other_pages(self):returnself.has_previous()orself.has_next()defnext_page_number(self):returnself.paginator.validate_number(self.number+1)defprevious_page_number(self):returnself.paginator.validate_number(self.number-1)defstart_index(self):"""Returnthe1-basedindexofthefirstobjectonthispage,relativetototalobjectsinthepaginator."""#Specialcase,returnzeroifnoitems.ifself.paginator.count==0:return0return(self.paginator.per_page*(self.number-1))+1defend_index(self):"""Returnthe1-basedindexofthelastobjectonthispage,relativetototalobjectsfound(hits)."""#Specialcaseforthelastpagebecausetherecanbeorphans.ifself.number==self.paginator.num_pages:returnself.paginator.countreturnself.number*self.paginator.per_page

关于“Django怎么实现翻页”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。