Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)
文章目录
- 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">‹‹ </a></li>{% else %}<li><span class="disabled prev">‹‹ </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"> ››</a></li>{% else %}<li><span class="disabled next"> ››</span></li>{% endif %}</ul>
</div>
效果显示如下:
Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)相关推荐
- Diango博客--18.使用 Fabric 自动化部署 Django 项目
文章目录 1.本地安装 Fabric 2.部署过程回顾 3.完善项目配置 4.修改 BASE_DIR 配置项 5.设置 Supervisor 环境变量 6.编写 Fabric 脚本 7.执行 Fabr ...
- Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署
文章目录 0.部署前准备 1.创建一个超级用户 2.更新 SQLite3 3.安装 Python3 .pip3.6以及 Pipenv 4.部署代码 5.使用 Gunicorn 6.启动 Nginx 服 ...
- html5互动场景制作系统,春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版发布...
经过一个月的艰苦努力,春哥团队最新作品即将与大家见面了,<2015年6月春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版>即将来临, 现在春哥接受预定啦,春哥技术博客依然走价格 ...
- Diango博客--15.通过 Django Pagination 实现简单分页(一)
文章目录 0.思路引导 1.Paginator 类的常用方法 2.用 Paginator 给文章列表分页 3.在模板中设置分页导航 4.效果展示 0.思路引导 1)当博客上发布的文章越来越多时,通常需 ...
- Diango博客--22.Django Haystack 全文检索与关键词高亮
文章目录 1. Django Haystack 简介 2. 安装 django-haystack和elasticsearch 2 3. 构建容器来运行 elasticsearch 服务 4. 配置 H ...
- 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Blueprint 蓝图 定义一个蓝图 注册一个蓝图 创建蓝 ...
- Diango博客--25.使用Coverage统计测试覆盖率
文章目录 1. 前言 2. 安装 Coverage 3. 简单配置 Coverage 4. 运行 Coverage 5. 完善 Coverage 配置 6. 生成 HTML 报告 7. 完善单元测试 ...
- Diango博客--23.单元测试:测试 blog 应用
文章目录 1. 前言 2. 搭建测试环境 3. 测试模型 4. 测试视图 5. 测试模板标签 6. 测试辅助方法和类 1. 前言 我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已 ...
- Diango博客--21.实现简单的全文搜索
文章目录 1. 概述 2. 模板:将关键词提交给服务器 3. 视图:查找含有搜索关键词的文章 4. 视图:绑定 URL 1. 概述 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Dja ...
最新文章
- 技术图文:如何利用 Turtle 绘制一棵漂亮的樱花树
- BeanUtils 是用 Spring 的还是 Apache 的好?
- 2021西南位育高考成绩查询,上海近40所高中2020高考录取情况汇总!
- 【HDU6662】Acesrc and Travel【树形DP】
- 如何用50行代码构建情感分类器
- PID算法搞不懂?看这篇文章就够了。
- 【数据库系统】数据库引入空值null的意义
- LeetCode题 - 26 删除排序数组中的重复项 python实现
- u盘安装linux 提示no such device_IGH EtherCAT 开源主站安装及测试
- SSR端口冲突的解决法法
- 战略分析思路——沙盘推演逻辑
- python实例练习(9)图像的手绘效果
- 阿里中台搞了3年,凉了?网传:副总裁玄难“背锅”,辞职创业!咸鱼放弃维护 Flutter!...
- java邮件发送不成功,javamail发送邮件成功 但是却接收不到邮件?解决方法
- Wed Aug 03 19:48:03 +0800 2022这种字符串,怎么转成时间格式年月日
- Linux 中task_struck
- cortex a7 a53_试驾初体验--我与奥迪A7的七天之旅
- 三极管/达林顿管 管脚定义
- git动图快速制作方法
- 代驾APP小程序源码交付 所需功能大全