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+django实现文件上传
Jan 17 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
Selenium定位元素操作示例
Aug 10 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python数据库小程序源代码
Sep 15 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
python线程信号量semaphore使用解析
Nov 30 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
pandas取dataframe特定行列的实现方法
May 24 Python
详细介绍python类及类的用法
May 31 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遍历类中包含的所有元素的方法
2015/05/12 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
python版飞机大战代码分享
2018/11/20 Python
python实现大文件分割与合并
2019/07/22 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
WiFi云数码相框:Nixplay
2018/07/05 全球购物
我的画教学反思
2014/04/28 职场文书
会议通知
2015/04/15 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
无线电通信名词解释
2022/02/18 无线电
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
MySQL池化框架学习接池自定义
2022/07/23 MySQL