有的时候我们会在页面中展示大量数据,全部都放在一页可能会降低用户体验,Django提供了一个Paginator类来帮助我们管理分页数据。

起步

介绍分页器对象的一些属性和方法

1. 引入该类及相关异常模块:

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
  • Paginator:分页器对象
  • PageNotAnInteger:页码不是一个整数时引发该异常
  • EmptyPage:页码不在有效范围时(即数据为空)引发该异常

2. 分页器对象

分页器对象的属性:

  1. object_list, 对象列表即查询到的数据
  2. per_page, 每一页展示的内容
  3. orphans=0, 这是一个缺省参数,如果最后一页的数据小于这个值,会合并到上一页
  4. 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">&laquo;</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">&raquo;</span></a></li></ul></nav></div>

django分页(Paginator)相关推荐

  1. django分页-Paginator类

    2019独角兽企业重金招聘Python工程师标准>>> >>> from django.core.paginator import Paginator >&g ...

  2. django使用Paginator分页展示数据

    思路: view得到基本数据: 提供给前端当前页面的数据 判断是否有上一页/下一页 url路由 前端展示 View逻辑 写一个简单的View,使用Paginator时: 首先导入django.core ...

  3. Django 分页和使用Ajax5.3

    分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...

  4. Django分页的基本实现办法

    Django自带一个分页模块Pagination,具体的参考官方文档,我在这里简单介绍一下具体的例子,模拟一个常用场景,列出部分的代码出来.场景是这样的:我们有一个blog表,其中有若干条记录,我们要 ...

  5. 2019.03.20 mvt,Django分页

    MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...

  6. 2 django系列之django分页与templatetags

    preface 当页面出现的条目多的时候,我们就需要使用分页功能了.Django作为一个知名的web框架,自然也提供了分页功能,下面说说它. Python-shell 练练手 在python下入手 先 ...

  7. django分页的东西, 不详细, 但是也足够了。

    视图函数中的代码 from django.shortcuts import render, HttpResponse, redirect import json from django.core.pa ...

  8. django分页功能 views与templates

    分页 Django提供了数据分页的类,这些类被定义在django/core/paginator.py中 对象Paginator用于对列进行一页n条数据的分页运算 对象Page用于表示第m页的数据 Pa ...

  9. 分页 Paginator

    分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览. Django又很贴心的为我们提供了一个Paginator分页工具, ...

最新文章

  1. Handler、Looper与MessageQueue源码分析
  2. qt5.5 静态编译 mysql_QT5.3.2+mingw静态编译(生成exe大约14M)
  3. 笔记本网络计算机和设备不可见,xp电脑不显示无线网络的七种原因和解决方法...
  4. mybatis-启动源码分析
  5. 在NS-3中安装可视化工具pyviz的一些问题的解决
  6. 漫画:如何实现大整数相乘?(上)
  7. oschina mysql limit_如何提高MySQL Limit查询的性能
  8. python之父的名字-Python 常见双下划线关键字的用法
  9. python的根号运算_python怎么表示根号运算
  10. 控件加在JAVA的PANEL上,怎样才能充满
  11. Shell脚本 小程序演示
  12. JEB配合IDA神器逆向
  13. 计算机毕业设计Java社区团购系统(源码+系统+mysql数据库+Lw文档)
  14. 物联那点事儿之自制网络温湿度计(arduino+点灯科技篇)
  15. php小说阅读例子,Thinkphp掌上阅读功能完善强大的小说源码 - 四套模板
  16. 深度剖析U8系统前后台数据关系-王成军-专题视频课程
  17. Linux /usr/src/kernels 目录为空的解决方法
  18. pta统计字符出现次数
  19. 混合开发中,H5页面如何监听Android手机返回键
  20. 1一9数字行书写法_数字1-9的标准写法-1~9的书写格式

热门文章

  1. 搜索软件everything,搜索电脑中文件,快速定位
  2. Python简单处理excel数据(拆分合并单元格、根据表头合并sheet、添加列数、添加内容操作)
  3. 关于DBeaver stored procedure中print语句的内容看不见,smss可以的问题
  4. 数通运营商方向常见面试问题(第五部分)
  5. sip 信令组成的基本格式 总结
  6. windows server 2008R2怎么设置活动但空闲的远程桌面服务会话时间的限制
  7. 杭电OJ 1181(C++)
  8. 【ubuntu编译安装Halide】
  9. fluter的环境搭配及android studio开发
  10. Python机器学习:认识机器学习