博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django-分页器
阅读量:5977 次
发布时间:2019-06-20

本文共 5158 字,大约阅读时间需要 17 分钟。

#######django-分页器########问题的引出:在模板页面渲染时,比如我们渲染的是书籍的一些信息,假如就只有10,20本书,          完全可以渲染出来(意思的渲染出来,不会影响页面的美观),万一是一个很多的图书系统,          里面的书籍几千本,上万本,你在一个页面渲染出来(不知道一个页面行不行),肯定是不          好看的,所以这时候必须要有分页器了。那怎么去使用分页器呢?from django.core.paginator import Paginatorpaginator = Paginator(object_list,per_page)# 解释下这里的参数吧,其实一看就能明白个大概# object_list:对象列表,也是就一个列表里装多个对象元素# per_page:就是一页显示多少条记录paginator对象下有很多方法,说实话,我也记不住,但是在写程序的时候,你可以通过.来看他下面的一系列的方法,通过方法名字,你可以大概知道是什么意思。# num_pages  看名字就大概知道这是显示该对象有多少页,看源码,它返回的是一个int类型的数字# 它是一个对象的方法,通过装饰器伪装成对象属性page_num = paginator.num_pages# count 这个单词肯定会吧,在这里显示的是object_list中元素的个数,也是一个方法看它的源码,# 大概就是这样出来,假如是个列表的话,就调用列表下的count方法,不是的话,就直接用len()方法了,count = paginator.count# page_range 这个和range差不多PageRange = paginator.page_range# page  传一个数字,假如你想取到第五页,就传5进去,他会返回一个page对象,这个对象里是当前页的一些对象# 返回的page对象下面也有方法page_obj = paginator.page(1)# has_next()它的返回值是一个布尔类型,大概意思就是:是否有下一页page_obj.has_next()# has_next()它的返回值是一个布尔类型,大概意思就是:是否有上一页page_obj.has_previous()# previous_page_number() 它的返回值是一个int类型,上一页的页码数page_obj.previous_page_number()# next_page_number() 它的返回值是一个int类型,下一页的页码数page_obj.next_page_number()####简单些写一个分页器的效果(前提我数据库中有100条数据)    不考虑代码的健壮性问题models文件:    class Book(models.Model)        name = models.CharField(max_length=32)views文件:    def index(request):        books = models.Book.objects.all()        paginator = Paginator(books,10)        get_num = request.GET.get('page')        page_obj = paginator.page(int(get_num))        return render(request,'index.html',local())index.html文件:    
{
% for book in page_obj %}
{
%endfor%}
序号 书名
{
{book.id}}
{
{book.name}}
上面就是一个简单的分页效果,你可以通过127.0.0.1:8000/index?page=2,给page传值访问到想要的页面想要在下面写一个分页的按钮,比如上一页,第几页什么的,你前端好的话可以写写,我前端太差,就说说思路我们是不是可以通过paginator这个对象,拿到有多少页(num_pages这个方法对吧),然后就是for循环的事了,a标签对应的url记得相对应哟。上面的代码完全没考虑到健壮性,会有bug的。bug: 1、假如输入的url为127.0.0.1:8000/index?page=1111,很显然,我100条数据,每页10条,就10页对吧 显然1111超过了我的范围,是负数也是不符合吧,这是一个点会出bug, 2、还有我的url为127.0.0.1:8000/index?page=sadas,很显然这不是一个int类型,我视图函数中直接用int 转换也会出错。 3、最后开始我只有100条数据,万一我有一万条数据,那么就是1000页,那我在前端不就是有1000个页码数嘛?下面是改进版(样式不会调,我就用bootstrap):views文件: def index(request): books = models.Book.objects.all() paginator = Paginator(books, 5) try: # 从get请求中取到浏览器请求的页码数get_num,假如不能转成整型,就跳转到第一页 get_num = request.GET.get('page') get_num = int(get_num) except Exception as e: get_num = 1 # 这里分页器遵循前五页,后五页,和当前页 if paginator.num_pages > 11: if get_num-5 < 1: PageRange = range(1,12) elif get_num+5 > paginator.num_pages: PageRange = range(paginator.num_pages-11,paginator.num_pages+1) else: PageRange = range(get_num-5,get_num+6) else: PageRange = paginator.page_range try: # 这里万一浏览器请求的页码数get_num大于paginator.num_pages,就会报错,我捕捉该异常 page_obj = paginator.page(get_num) except Exception as e: get_num = 1 page_obj = paginator.page(get_num) return render(request, 'index.html', locals())index.html文件:
图书列表
{
% for foo in page_obj %}
{
% endfor %}
序号 书名 价钱
{ { foo.id }} { { foo.name }} { { foo.price }}
{
# 下面就是前端页面中显示页数,点击可以跳转,有上一页,下一页 #}
额额,可能代码很多,就这样吧,详情可参考其他博客

 

转载于:https://www.cnblogs.com/zhuchunyu/p/9991084.html

你可能感兴趣的文章
在巴塞罗那,华为挥别昨日 | MWC 2019
查看>>
我们3666人的【阿里Java技术进阶】钉钉大群,又增添新 “成员” 啦~ ...
查看>>
同盾科技与中科实数共建互联网反黑产联合实验室 ...
查看>>
读懂微信:从1.0到7.0版本,一个主流IM社交工具的进化史 ...
查看>>
Flask 教程 第十章:邮件支持
查看>>
C++雾中风景13:volatile解惑
查看>>
绿色版Mysql自动建立my.ini和命令行启动并动态指定datadir路径
查看>>
华为5G手机发布!5G和AI给世界带来什么?
查看>>
SQL Server使用sp_spaceused查看表记录存在不准确的情况
查看>>
网站服务器购买配置选购方案
查看>>
python实现双向链表基本结构及其基本方法
查看>>
DKHadoop安装的环境准备介绍
查看>>
Unity3dNetwork网络基础学习
查看>>
电影《我不是药神》观后感
查看>>
白硕:区块链+开源数据库≥商业数据库
查看>>
springboot项目错误页面的设置
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 19 章 服务器配置_19.5. 预写式日志
查看>>
11月23日云栖精选夜读 | Java开发者福音 阿里巴巴宣布连任Java全球管理组织席位...
查看>>
PHP获取IP地址的方法,防止伪造IP地址注入攻击
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 18 章 服务器设置和操作_18.5. 关闭服务器...
查看>>