演示环境接上篇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数据:
> use test3;
> desc bookshop_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 | |
+----------+---------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
> insert into bookshop_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 * from bookshop_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 |
+----+--------------+---------+-----------------+----------+---------+
13 rows in set (0.00 sec)
设计以5条数据为一页,根据上述查询结果有13条数据,应该出现分为3页,每页显示5条记录且最后一页仅有3条记录;
]# cd py3/django-test1/test5
修改视图函数:
]# vim bookshop/views.py
import os
from django.shortcuts import render
from django.http import HttpResponse
from django.conf import settings
from .models import *
from django.core.paginator import *
def herolist(request,pindex):
if pindex == '':
pindex = '1'
list1 = HeroInfo.objects.all()
paginator = Paginator(list1,5)
page = paginator.page(int(pindex))
context = {'page':page}
return render(request, 'bookshop/herolist.html',context)
def index(request):
return render(request,'bookshop/index.html')
def myExp(request):
a1 = int('abc')
return HttpResponse('hello_world')
def uploadPhoto(request):
return render(request,'bookshop/uploadphoto.html')
def uploadHandle(request):
pic1 = request.FILES['photo1']
picName = os.path.join(settings.MEDIA_ROOT,pic1.name)
with open(picName,'wb') as f:
for p in pic1.chunks():
f.write(p)
return HttpResponse('<img src="/static/upload/%s" />' % pic1.name)
添加html模板:
]# vim templates/bookshop/herolist.html
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<ul>
{% for hero in page %}
<li>{{ hero.hname }}</li>
{% endfor %}
</ul>
<hr>
{% for index in page.paginator.page_range %}
{% if index == page.number %} <!--等号两边必须要有空格-->
{{ index }}<!--显示当前页,数字链接不显示下划线-->
{% else %}
<a href="/herolist/{{ index }}">{{ index }}</a>
{% endif %}
{% endfor %}
</body>
</html>
修改url:
]# vim bookshop/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
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服务器:
]# python manage.py runserver 192.168.255.70:8000
浏览器访问:http://192.168.255.70:8000/herolist/1/
注意:此代码要求第一页时,访问必须输入页号1,才能显示,否则报错。
页面显示:
点击第2页,显示:
点击第3页,显示:
且显示的当前页没有链接的下划线。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。