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的面向对象思想分析
Jan 14 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
PyQt5每天必学之组合框
Apr 20 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
python 制作简单的音乐播放器
Nov 25 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 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
PHP 转义使用详解
2013/07/15 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
python文本数据处理学习笔记详解
2019/06/17 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
国家奖学金获奖感言
2014/08/16 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
学习党章的体会
2014/11/07 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
如何在C++中调用Python
2021/05/21 Python
SQL SERVER触发器详解
2022/02/24 SQL Server