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 相关文章推荐
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
Python3中详解fabfile的编写
Jun 24 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
初学者学习Python好还是Java好
May 26 Python
Python select及selectors模块概念用法详解
Jun 22 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python必备技巧之字符数据操作详解
Mar 23 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
Views rows style模板重写代码
2011/05/16 PHP
一个PHP分页类的代码
2011/05/18 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
python实现俄罗斯方块
2018/06/26 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
2014年中班元旦活动方案
2014/02/14 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
实习计划书范文
2015/01/16 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
情况说明书格式及范文
2019/06/24 职场文书
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle