文章目录

  • 0.思路引导
  • 1.分页效果概述
  • 2.分页思路
  • 3.Django 第三方拓展:django-pure-pagination
  • 4.自定义模板

0.思路引导

1)在前面我们通过 Django Pagination 实现简单分页 中,我们实现了一个简单的分页导航。但效果有点差强人意,我们只能点上一页和下一页的按钮进行翻页。

2)比较完善的分页效果应该像下面这样,但想实现这样一种效果,Django Pagination 内置的 API 已无能为力。

3)接下来我们将通过拓展 Django Pagination 来实现下图这样比较完善的分页效果。

1.分页效果概述

一个比较完善的分页效果应该具有以下特性:

  • 始终显示第一页和最后一页。
  • 当前页码高亮显示。
  • 显示当前页码前后几个连续的页码。
  • 如果两个页码号间还有其它页码,中间显示省略号以提示用户。

2.分页思路

如果需要自己来实现分页效果,我们会怎么做呢?先来分析一下导航条的组成部分,可以看到整个分页导航条其实可以分成 7 个部分:

  • 第 1 页页码,这一页需要始终显示。
  • 第 1 页页码后面的省略号部分。但要注意如果第 1 页的页码号后面紧跟着页码号 2,那么省略号就不应该显示。
  • 当前页码的左边部分,比如这里的 3-4。
  • 当前页码,比如这里的 5。
  • 当前页码的右边部分,比如这里的 6-7。
  • 最后一页页码前面的省略号部分。但要注意如果最后一页的页码号前面跟着的页码号是连续的,那么省略号就不应该显示。
  • 最后一页的页码号。

因此我们的思路是,在视图中依据上述规则生成页码列表,然后在模板中循环显示页码列表就可以了。

有了思路,实现起来其实也并不很难。不过对于这类常见需求,别人早就帮我们实现好了,本着不重复造轮子的原则,直接拿来用就好。

3.Django 第三方拓展:django-pure-pagination

我们第一次开始接触 django 第三方拓展,在此之前我们一直都基于 django 本身我们提供的功能在开发,然而 django 强大的地方就在于海量的第三方应用供我们挑选,几乎大部分 web 开发中的需求,django 都能找到他人已经写好的第三方应用,拿来即用。

事实上,正确的 django 开发姿势应该是这样的:

  • 充分理解你的需求,想一想,如果自己实现,我会怎么做?
  • 通过 Google、GitHub、开发者社区论坛等调研已有的实现类似需求的应用
  • 拿来即用,并尝试理解他人是如何实现这个功能的

首先我们上面分析了分页需求的实现。然后我在 GitHub 上通过 django pagination 关键词进行搜索,在比较了多个 star 数比较高的项目后,发现 django-pure-pagination 文档最清晰,使用最简单,因此决定将这个应用集成到我们的博客来。值得一提的是,尽管这个应用显示作者最后一次更新代码在 4 年前,但我粗略浏览了一下源码,发现其依赖的 django api 4 年来异常稳定,所以确保能在 django 2.2 中使用。

具体的源代码请戳这里,根据教程,做以下扩展:

1)首先安装它:

$ pipenv install django-pure-pagination

2)然后将它注册到 INSTALLED_APPS 里:

INSTALLED_APPS = [# ...'pure_pagination',  # 分页'blog.apps.BlogConfig',  # 注册 blog 应用'comments.apps.CommentsConfig',  # 注册 comments 应用
]

3)修改 IndexView,让它继承 django-pure-pagination 提供的 PaginationMixin,这个混入类将为我们提供上述提到的分页功能。

class IndexView(PaginationMixin, ListView):model = Posttemplate_name = 'blog/index.html'context_object_name = 'post_list'paginate_by = 10

4)然后在 common.py 配置中配置一下分页的效果,这是 django-pure-pagination 提供的配置项,用于个性化配置分页效果:

# django-pure-pagination 分页设置
PAGINATION_SETTINGS = {'PAGE_RANGE_DISPLAYED': 4, # 分页条当前页前后应该显示的总页数(两边均匀分布,因此要设置为偶数),'MARGIN_PAGES_DISPLAYED': 2, # 分页条开头和结尾显示的页数'SHOW_FIRST_PAGE_WHEN_INVALID': True, # 当请求了不存在页,显示第一页
}

5)在模板中需要分页的地方,调用分页对象的 render 方法就可以了,比如在 index.html 中:

{% if is_paginated %}{{ page_obj.render }}
{% endif %}

注意这里 page_obj 是分页后的对象列表,具体请参考上一篇文章的讲解。render 方法会自动帮我们渲染一个预先定义好的分页条,至此,分页功能就完成了。效果显示如下:

4.自定义模板

上边可以看出,有时候预定义的分页条并不能满足我们的需求,因此我们需要通过自定义的模板来覆盖预定义的模板。

django 查找模板的顺序是,首先在项目配置的模板根路径寻找(我们项目中配的是 templates 文件夹),没有找到的话,再去应用的 templates 目录下寻找。

分页模板预定义的路径为 pure_pagination/pagination.html,所以我们可以在项目模板根路径下建立一个一模一样的文件结构,这样 django 就会首先找到我们的模板,从而应用我们自定义的模板,而不是预定义的模板。

在 templates 目录下新建一个 pure_pagination\ 目录,然后建立一个 pagination.html 文件。

接下来便是在模板中设置分页导航了,将导航条的七个部分的数据一一展现即可,示例代码如下:

<div class="text-center pagination" style="width: 100%"><ul>{% if page_obj.has_previous %}<li><a href="?{{ page_obj.previous_page_number.querystring }}"class="prev">&lsaquo;&lsaquo; </a></li>{% else %}<li><span class="disabled prev">&lsaquo;&lsaquo; </span></li>{% endif %}{% for page in page_obj.pages %}{% if page %}{% ifequal page page_obj.number %}<li class="current"><a href="#">{{ page }}</a></li>{% else %}<li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li>{% endifequal %}{% else %}...{% endif %}{% endfor %}{% if page_obj.has_next %}<li><a href="?{{ page_obj.next_page_number.querystring }}" class="next"> &rsaquo;&rsaquo;</a></li>{% else %}<li><span class="disabled next"> &rsaquo;&rsaquo;</span></li>{% endif %}</ul>
</div>

效果显示如下:

Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)相关推荐

  1. Diango博客--18.使用 Fabric 自动化部署 Django 项目

    文章目录 1.本地安装 Fabric 2.部署过程回顾 3.完善项目配置 4.修改 BASE_DIR 配置项 5.设置 Supervisor 环境变量 6.编写 Fabric 脚本 7.执行 Fabr ...

  2. Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署

    文章目录 0.部署前准备 1.创建一个超级用户 2.更新 SQLite3 3.安装 Python3 .pip3.6以及 Pipenv 4.部署代码 5.使用 Gunicorn 6.启动 Nginx 服 ...

  3. html5互动场景制作系统,春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版发布...

    经过一个月的艰苦努力,春哥团队最新作品即将与大家见面了,<2015年6月春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版>即将来临, 现在春哥接受预定啦,春哥技术博客依然走价格 ...

  4. Diango博客--15.通过 Django Pagination 实现简单分页(一)

    文章目录 0.思路引导 1.Paginator 类的常用方法 2.用 Paginator 给文章列表分页 3.在模板中设置分页导航 4.效果展示 0.思路引导 1)当博客上发布的文章越来越多时,通常需 ...

  5. Diango博客--22.Django Haystack 全文检索与关键词高亮

    文章目录 1. Django Haystack 简介 2. 安装 django-haystack和elasticsearch 2 3. 构建容器来运行 elasticsearch 服务 4. 配置 H ...

  6. 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Blueprint 蓝图 定义一个蓝图 注册一个蓝图 创建蓝 ...

  7. Diango博客--25.使用Coverage统计测试覆盖率

    文章目录 1. 前言 2. 安装 Coverage 3. 简单配置 Coverage 4. 运行 Coverage 5. 完善 Coverage 配置 6. 生成 HTML 报告 7. 完善单元测试 ...

  8. Diango博客--23.单元测试:测试 blog 应用

    文章目录 1. 前言 2. 搭建测试环境 3. 测试模型 4. 测试视图 5. 测试模板标签 6. 测试辅助方法和类 1. 前言 我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已 ...

  9. Diango博客--21.实现简单的全文搜索

    文章目录 1. 概述 2. 模板:将关键词提交给服务器 3. 视图:查找含有搜索关键词的文章 4. 视图:绑定 URL 1. 概述 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Dja ...

最新文章

  1. 技术图文:如何利用 Turtle 绘制一棵漂亮的樱花树
  2. BeanUtils 是用 Spring 的还是 Apache 的好?
  3. 2021西南位育高考成绩查询,上海近40所高中2020高考录取情况汇总!
  4. 【HDU6662】Acesrc and Travel【树形DP】
  5. 如何用50行代码构建情感分类器
  6. PID算法搞不懂?看这篇文章就够了。
  7. 【数据库系统】数据库引入空值null的意义
  8. LeetCode题 - 26 删除排序数组中的重复项 python实现
  9. u盘安装linux 提示no such device_IGH EtherCAT 开源主站安装及测试
  10. SSR端口冲突的解决法法
  11. 战略分析思路——沙盘推演逻辑
  12. python实例练习(9)图像的手绘效果
  13. 阿里中台搞了3年,凉了?网传:副总裁玄难“背锅”,辞职创业!咸鱼放弃维护 Flutter!...
  14. java邮件发送不成功,javamail发送邮件成功 但是却接收不到邮件?解决方法
  15. Wed Aug 03 19:48:03 +0800 2022这种字符串,怎么转成时间格式年月日
  16. Linux 中task_struck
  17. cortex a7 a53_试驾初体验--我与奥迪A7的七天之旅
  18. 三极管/达林顿管 管脚定义
  19. git动图快速制作方法
  20. 代驾APP小程序源码交付 所需功能大全

热门文章

  1. C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述
  2. 换位思考的最高境界是换待遇,所以,换位思考就是空话!!!
  3. h.264视频文件封装
  4. 远程网络视频监视技术
  5. H.264学习历程(天之骄子)
  6. JDK和CGLIB动态代理区别
  7. 如果风 知道 ... 如果云 知道 ...
  8. Astyle 一键格式化项目代码
  9. 背包问题(动态规划)
  10. SJXXX串口扩展芯片 4串口芯片 UART串口芯片