django分页(Paginator)
有的时候我们会在页面中展示大量数据,全部都放在一页可能会降低用户体验,Django提供了一个Paginator类来帮助我们管理分页数据。
起步
介绍分页器对象的一些属性和方法
1. 引入该类及相关异常模块:
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
- Paginator:分页器对象
- PageNotAnInteger:页码不是一个整数时引发该异常
- EmptyPage:页码不在有效范围时(即数据为空)引发该异常
2. 分页器对象
分页器对象的属性:
- object_list, 对象列表即查询到的数据
- per_page, 每一页展示的内容
- orphans=0, 这是一个缺省参数,如果最后一页的数据小于这个值,会合并到上一页
- allow_empty_first_page=True, 允许首页为空 ,默认为True
分页器对象的方法:
方法 | 描述 |
---|---|
page | 返回一个Page对象 |
count | 返回对象列表(数据)的长度 |
num_pages | 返回总页数 |
page_range | 返回页码列表 |
3. Page对象
Page对象是一般用来指定当前页
Page对象的属性,
- object_list:同样是指对象列表,不过只包含当前页的对象
- number:当前页面的页码
- paginator :指对应的分页器对象(Paginator )
注意,Paginator对象是由我们进行实例化的,而Page对象在Paginator对象使用page方法时实现
Page对象的方法:
方法 | 描述 |
---|---|
has_next | 是否有下一页 |
has_previous | 是否有上一页 |
has_other_pages | 是否有上一页或下一页 |
next_page_number | 返回下一页的页码 |
previous_page_number | 返回上一页的页码 |
start_index | 返回当前页起始的对象序号 |
end_index | 返回当前页结束的对象序号 |
应用
介绍完Paginator对象,已经基本可以亲自动手实现一个分页器对象了,但暂时我们不需要那样做。接下来,来应用该分页器对象,我已经封装好了一个函数来使用它。
def split_page(object_list, request, per_page=8):paginator = Paginator(object_list, per_page)# 取出当前需要展示的页码, 默认为1page_num = request.GET.get('page', default='1')# 根据页码从分页器中取出对应页的数据try:page = paginator.page(page_num)except PageNotAnInteger as e:# 不是整数返回第一页数据page = paginator.page('1')page_num = 1except EmptyPage as e:# 当参数页码大于或小于页码范围时,会触发该异常print('EmptyPage:{}'.format(e))if int(page_num) > paginator.num_pages:# 大于 获取最后一页数据返回page = paginator.page(paginator.num_pages)else:# 小于 获取第一页page = paginator.page(1)# 这部分是为了再有大量数据时,仍然保证所显示的页码数量不超过10,page_num = int(page_num)if page_num < 6:if paginator.num_pages <= 10:dis_range = range(1, paginator.num_pages + 1)else:dis_range = range(1, 11)elif (page_num >= 6) and (page_num <= paginator.num_pages - 5):dis_range = range(page_num - 5, page_num + 5)else:dis_range = range(paginator.num_pages - 9, paginator.num_pages + 1)data = {'page': page, 'paginator': paginator, 'dis_range ': dis_range }return data
使用了bootstrap中的基本分页,展示效果如下图所示:
对应模板代码:
<div class="container"><nav aria-label="Page navigation"><ul class="pagination"><!--上一页--><li class="{% if not page.has_previous %}disabled{% endif %}">{% if page.has_previous %}<a href="{% url 'index' %}?page={{ page.previous_page_number }}" aria-label="Previous">{% endif %}<span aria-hidden="true">«</span></a></li><!--页码--><!--这里展示页码使用传递过来的dis_range -->{% for num in dis_range %}<li class="{% if num == page.number %}active{% else %}{% endif %}" ><a href="{% url 'index' %}?page={{ num }}">{{ num }}</a></li>{% endfor %}<!--下一页--> <li class="{% if not page.has_next %}disabled{% endif %}">{% if page.has_next %}<a href="{% url 'index' %}?page={{ page.next_page_number }}" aria-label="Next">{% endif %}<span aria-hidden="true">»</span></a></li></ul></nav></div>
django分页(Paginator)相关推荐
- django分页-Paginator类
2019独角兽企业重金招聘Python工程师标准>>> >>> from django.core.paginator import Paginator >&g ...
- django使用Paginator分页展示数据
思路: view得到基本数据: 提供给前端当前页面的数据 判断是否有上一页/下一页 url路由 前端展示 View逻辑 写一个简单的View,使用Paginator时: 首先导入django.core ...
- Django 分页和使用Ajax5.3
分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...
- Django分页的基本实现办法
Django自带一个分页模块Pagination,具体的参考官方文档,我在这里简单介绍一下具体的例子,模拟一个常用场景,列出部分的代码出来.场景是这样的:我们有一个blog表,其中有若干条记录,我们要 ...
- 2019.03.20 mvt,Django分页
MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...
- 2 django系列之django分页与templatetags
preface 当页面出现的条目多的时候,我们就需要使用分页功能了.Django作为一个知名的web框架,自然也提供了分页功能,下面说说它. Python-shell 练练手 在python下入手 先 ...
- django分页的东西, 不详细, 但是也足够了。
视图函数中的代码 from django.shortcuts import render, HttpResponse, redirect import json from django.core.pa ...
- django分页功能 views与templates
分页 Django提供了数据分页的类,这些类被定义在django/core/paginator.py中 对象Paginator用于对列进行一页n条数据的分页运算 对象Page用于表示第m页的数据 Pa ...
- 分页 Paginator
分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览. Django又很贴心的为我们提供了一个Paginator分页工具, ...
最新文章
- Handler、Looper与MessageQueue源码分析
- qt5.5 静态编译 mysql_QT5.3.2+mingw静态编译(生成exe大约14M)
- 笔记本网络计算机和设备不可见,xp电脑不显示无线网络的七种原因和解决方法...
- mybatis-启动源码分析
- 在NS-3中安装可视化工具pyviz的一些问题的解决
- 漫画:如何实现大整数相乘?(上)
- oschina mysql limit_如何提高MySQL Limit查询的性能
- python之父的名字-Python 常见双下划线关键字的用法
- python的根号运算_python怎么表示根号运算
- 控件加在JAVA的PANEL上,怎样才能充满
- Shell脚本 小程序演示
- JEB配合IDA神器逆向
- 计算机毕业设计Java社区团购系统(源码+系统+mysql数据库+Lw文档)
- 物联那点事儿之自制网络温湿度计(arduino+点灯科技篇)
- php小说阅读例子,Thinkphp掌上阅读功能完善强大的小说源码 - 四套模板
- 深度剖析U8系统前后台数据关系-王成军-专题视频课程
- Linux /usr/src/kernels 目录为空的解决方法
- pta统计字符出现次数
- 混合开发中,H5页面如何监听Android手机返回键
- 1一9数字行书写法_数字1-9的标准写法-1~9的书写格式
热门文章
- 搜索软件everything,搜索电脑中文件,快速定位
- Python简单处理excel数据(拆分合并单元格、根据表头合并sheet、添加列数、添加内容操作)
- 关于DBeaver stored procedure中print语句的内容看不见,smss可以的问题
- 数通运营商方向常见面试问题(第五部分)
- sip 信令组成的基本格式 总结
- windows server 2008R2怎么设置活动但空闲的远程桌面服务会话时间的限制
- 杭电OJ 1181(C++)
- 【ubuntu编译安装Halide】
- fluter的环境搭配及android studio开发
- Python机器学习:认识机器学习