django之分页显示
演示环境接上篇django。
说明:
Django提供了一些类,来实现管理数据分页:Paginator对象、Page对象。
其中Paginator类对象介绍如下:
Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数;
Paginator类对象属性有:count:对象总数;num_pages:页面总数;page_range:页码列表,从1开始,例如[1, 2, 3, 4];
Paginator类对象方法有:page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常。
Page类对象介绍如下:
Paginator对象的page()方法返回Page对象,不需要手动构造;
Page类对象的属性有:object_list:当前页上所有对象的列表;number:当前页的序号,从1开始;paginator:当前page对象相关的Paginator对象;
Page类对象的方法有:has_next():如果有下一页返回True;has_previous():如果有上一页返回True;has_other_pages():如果有上一页或下一页返回True;next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常;previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常;len():返回当前页面对象的个数;迭代页面对象:访问当前页面中的每个对象。
制作实验所需数据,添加mysql数据:
>usetest3;>descbookshop_heroinfo;+----------+---------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+----------+---------------+------+-----+---------+----------------+|id|int(11)|NO|PRI|NULL|auto_increment||hname|varchar(10)|NO||NULL|||hgender|tinyint(1)|NO||NULL|||hcontent|varchar(1000)|NO||NULL|||isDelete|tinyint(1)|NO||NULL|||book_id|int(11)|NO|MUL|NULL||+----------+---------------+------+-----+---------+----------------+6rowsinset(0.01sec)>insertintobookshop_heroinfo(hname,hgender,book_id,hcontent,isDelete)values('郭靖',1,1,'降龙十八掌',0),('黄蓉',0,1,'打狗棍法',0),('段誉',1,1,'六脉神剑',0),('虚竹',0,1,'天山六阳掌',0),('王语嫣',1,1,'神仙姐姐',0),('令狐冲',0,1,'孤独九剑',0),('任盈盈',1,1,'弹琴',0),('岳不群',0,1,'华山剑法',0),('东方不败',1,1,'葵花宝典',0),('胡斐',0,1,'胡家刀法',0),('苗若兰',1,1,'黄衣',0),('程灵素',0,1,'医术',0),('袁紫衣',1,1,'六合拳',0);>select*frombookshop_heroinfo;+----+--------------+---------+-----------------+----------+---------+|id|hname|hgender|hcontent|isDelete|book_id|+----+--------------+---------+-----------------+----------+---------+|1|郭靖|1|降龙十八掌|0|1||2|黄蓉|0|打狗棍法|0|1||3|段誉|1|六脉神剑|0|1||4|虚竹|0|天山六阳掌|0|1||5|王语嫣|1|神仙姐姐|0|1||6|令狐冲|0|孤独九剑|0|1||7|任盈盈|1|弹琴|0|1||8|岳不群|0|华山剑法|0|1||9|东方不败|1|葵花宝典|0|1||10|胡斐|0|胡家刀法|0|1||11|苗若兰|1|黄衣|0|1||12|程灵素|0|医术|0|1||13|袁紫衣|1|六合拳|0|1|+----+--------------+---------+-----------------+----------+---------+13rowsinset(0.00sec)
设计以5条数据为一页,根据上述查询结果有13条数据,应该出现分为3页,每页显示5条记录且最后一页仅有3条记录;
]#cdpy3/django-test1/test5
修改视图函数:
]#vimbookshop/views.pyimportosfromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefromdjango.confimportsettingsfrom.modelsimport*fromdjango.core.paginatorimport*defherolist(request,pindex):ifpindex=='':pindex='1'list1=HeroInfo.objects.all()paginator=Paginator(list1,5)page=paginator.page(int(pindex))context={'page':page}returnrender(request,'bookshop/herolist.html',context)defindex(request):returnrender(request,'bookshop/index.html')defmyExp(request):a1=int('abc')returnHttpResponse('hello_world')defuploadPhoto(request):returnrender(request,'bookshop/uploadphoto.html')defuploadHandle(request):pic1=request.FILES['photo1']picName=os.path.join(settings.MEDIA_ROOT,pic1.name)withopen(picName,'wb')asf:forpinpic1.chunks():f.write(p)returnHttpResponse('<imgsrc="/static/upload/%s"/>'%pic1.name)
添加html模板:
]#vimtemplates/bookshop/herolist.html<!DOCTYPEhtml><html><head><title>Title</title></head><body><ul>{%forheroinpage%}<li>{{hero.hname}}</li>{%endfor%}</ul><hr>{%forindexinpage.paginator.page_range%}{%ifindex==page.number%}<!--等号两边必须要有空格-->{{index}}<!--显示当前页,数字链接不显示下划线-->{%else%}<ahref="/herolist/{{index}}">{{index}}</a>{%endif%}{%endfor%}</body></html>
修改url:
]#vimbookshop/urls.pyfromdjango.conf.urlsimporturlfrom.importviewsurlpatterns=[url(r'^$',views.index),url(r'^myexp$',views.myExp),url(r'^uploadphoto$',views.uploadPhoto),url(r'^uploadHandle$',views.uploadHandle),url(r'^herolist/(\d+)/$',views.herolist),]
运行django服务器:
]#pythonmanage.pyrunserver192.168.255.70:8000
浏览器访问:http://192.168.255.70:8000/herolist/1/
注意:此代码要求第一页时,访问必须输入页号1,才能显示,否则报错。
页面显示:
点击第2页,显示:
点击第3页,显示:
且显示的当前页没有链接的下划线。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。