Django框架实现分页显示内容的方法详解


Posted in Python onMay 10, 2019

本文实例讲述了Django框架实现分页显示内容的方法。分享给大家供大家参考,具体如下:

分页

1、作用

数据加载优化

2、前端引入bootstrap样式:

{# 引入bootstrap样式的cdn资源 #}
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">

引入分页器:

<div id="rootbox">
  <h1>文章列表</h1>
  <ul id="bloglist">
    {# 遍历博文 #}
    {% for blog in page.object_list %}
      {# 显示博文标题 #}
      <li>
        <a href="{% url 'app:readblog' blog.id %}" rel="external nofollow" ><h3>{{ blog.title }}</h3></a>
      </li>
    {% endfor %}
  </ul>
  {#分页器:html内容拷贝于bootstrap网站-组件-分页#}
  {# bootstrap是一整套成熟经典的页面组件框架 #}
  <nav aria-label="Page navigation">
    <ul class="pagination">
      {# 上一页按钮 #}
      {# 如果有上一页 #}
      {% if page.has_previous %}
        <li>
          {# 点击超链接,对上一页的页面发起访问 #}
          <a href="{% url 'app:blogs' page.previous_page_number %}" rel="external nofollow" aria-label="Previous">
            <span aria-hidden="true">«</span>
          </a>
        </li>
      {# 如果没有上一页 #}
      {% else %}
        {# 当没有上一页时,阅读bootrap文档得知,对当前li使用disabled样式 #}
        <li class="disabled">
          {# href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ,处于禁用状态的按钮被点击时直接跳转本页 #}
          <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" aria-label="Previous">
            <span aria-hidden="true">«</span>
          </a>
        </li>
      {% endif %}
      {# 页码按钮 #}
      {# 遍历传入的页码范围 #}
      {% for p in pagerange %}
        {# 如果页码=当前页页码 #}
        {% ifequal p currentpage %}
          {# 被选中的页码具有高亮效果,阅读bootrap文档得知,对当前li使用active样式 #}
          {# {% url 'app:blogs' p %} 点击页码,对第p页的路由发起访问 #}
          <li class="active"><a href="{% url 'app:blogs' p %}" rel="external nofollow" rel="external nofollow" >{{ p }}</a></li>
        {% else %}
          {# 非当前页页码普通显示 #}
          <li><a href="{% url 'app:blogs' p %}" rel="external nofollow" rel="external nofollow" >{{ p }}</a></li>
        {% endifequal %}
      {% endfor %}
      {# 下一页按钮 #}
      {% if page.has_next %}
        <li>
          {# 点击超链接,对下一页的页面发起访问 #}
          <a href="{% url 'app:blogs' page.next_page_number %}" rel="external nofollow" aria-label="Next">
            <span aria-hidden="true">»</span>
          </a></li>
      {% else %}
        {# 当没有下一页时,阅读bootrap文档得知,对当前li使用disabled样式 #}
        <li class="disabled">
          {# href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ,处于禁用状态的按钮被点击时直接跳转本页 #}
          <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" aria-label="Next">
            <span aria-hidden="true">»</span>
          </a></li>
      {% endif %}
    </ul>
  </nav>
</div>

3、Paginator

  • 数据分页工具
  • 对象创建
    • Paginator(数据集,每一页数据数)
  • 属性
    • count:对象总数
    • page_range:页码列表,从1开始
    • num_pages:页面总数
  • 方法
    • page(整数): 获得一个page对象
  • 常见错误
    • InvalidPage:page()传递无效页码
    • PageNotAnInteger:page()传递的不是整数
    • Empty:page()传递的值有效,但是没有数据

4、Page

  • 具体的某一页面
  • 对象获得,通过Paginator的page()方法获得
  • 属性
    • object_list:当前页面上所有的数据对象
    • number:当前页的页码值
    • paginator: 当前page关联的Paginator对象
  • 方法
    • has_next():判断是否有下一页
    • has_previous():判断是否有上一页
    • has_other_pages():判断是否有上一页或下一页
    • next_page_number():返回下一页的页码
    • previous_page_number():返回上一页的页码
    • len():返回当前页的数据的个数
# 显示博文列表
# pagenum=路由参数=用户想要查看第几页
def showBlogs(request, pagenum):
  # 查询数据库获取所有博文
  blogs = Blog.objects.all()
  # 构建分页器对象,blogs=所有博文,2=每页显示的个数
  paginator = Paginator(blogs, 2)
  # 获取第n页的页面对象
  page = paginator.page(pagenum)
  # Paginator和Page的常用API
  # page.previous_page_number()
  # page.next_page_number()
  # page.has_previous()
  # page.has_next()
  # 构造页面渲染的数据
  '''
  渲染需要的数据:
  - 当前页的博文对象列表
  - 分页页码范围
  - 当前页的页码
  '''
  data = {
    # 当前页的博文对象列表
    'page': page,
    # 分页页码范围
    'pagerange': paginator.page_range,
    # 当前页的页码
    'currentpage': page.number,
  }
  # 将数据丢给页面渲染
  return render(request, 'blogs.html', context=data)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python实现bitmap数据结构详解
Feb 17 Python
python实现读Excel写入.txt的方法
Apr 29 Python
python如何求解两数的最大公约数
Sep 27 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python多线程与多进程及其区别详解
Aug 08 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
tensorflow 实现数据类型转换
Feb 17 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
python3处理word文档实例分析
Dec 01 Python
Django框架验证码用法实例分析
May 10 #Python
Python爬虫实现验证码登录代码实例
May 10 #Python
详解如何管理多个Python版本和虚拟环境
May 10 #Python
不到40行代码用Python实现一个简单的推荐系统
May 10 #Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 #Python
Python3列表内置方法大全及示例代码小结
May 10 #Python
详解python 爬取12306验证码
May 10 #Python
You might like
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
javascript 写类方式之十
2009/07/05 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
Python的Flask框架中web表单的教程
2015/04/20 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python内置模块collections知识点总结
2019/12/19 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
没编程基础可以学python吗
2020/06/17 Python
python实现登录与注册系统
2020/11/30 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
教师年终个人自我评价
2013/10/04 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
保密工作整改报告
2014/11/06 职场文书
教师学期末个人总结
2015/02/13 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS