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">&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>

效果显示如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同的写法 其中 1 2 (试了下 没有效果 ,先记载这里把)

转载于:https://www.cnblogs.com/kaibindirver/p/9145455.html

美国西北大学 计算机工程专业排名,[转载]美国西北大学计算机工程研究生最新专业排名...

对于打算去美国西北大学读研究生的学生来讲&#xff0c;美国西北大学研究生申请要求及美国西北大学研究生专业介绍是学生最关心的问题。本文香港介绍美国西北大学研究生申请要求及美国西北大学研究生的专业介绍&#xff0c;帮助更多的学生更好的了解美国西北大学。2016年西北大…

析构函数virtual与非virtual区别

作为通常的原则&#xff0c;如果一个类定义了虚函数&#xff0c;那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着&#xff1a;这个类会被继承&#xff0c;并且会通过基类的指针指向子类对象&#xff0c;从而得到多态性。 这个类可能会被继承&#xff0c;并且会…

Python:字典列表字符串方法测试

测试的一些Python中的关于字典、列表、字符串的使用方法&#xff0c;放在这里备查。整个测试代码和说明如下&#xff1a; # -*- coding: utf-8 -*- """Python:函数中全是指针传递&#xff0c;而任何变量都是给予一个指针指向一个内存空间"""impo…

Diango博客--17.统计各个分类和标签下的文章数

文章目录0.思路引导1.Model 回顾2.数据库数据聚合3.使用 Annotate4.在模板中引用新增的属性0.思路引导 在我们的博客侧边栏有分类列表和标签列表&#xff0c;显示博客已有的全部文章分类。现在想在分类名和标签名后显示该分类或者标签下有多少篇文章&#xff0c;该怎么做呢&am…

HTTP协议中request报文请求方法和状态响应码

一个HTTP请求报文由4部分组成&#xff1a; 请求行&#xff08;request line&#xff09;请求头部&#xff08;header&#xff09;空行请求数据下图给出了请求报文的一般格式&#xff1a; 请求行中包括了请求方法&#xff0c;常见的请求方法有&#xff1a; GET&#xff1a;从服务…

bmon:一个强大的网络带宽监视和调试工具

bmon 是类 Unix 系统中一个基于文本&#xff0c;简单但非常强大的 网络监视和调试工具&#xff0c;它能抓取网络相关统计信息并把它们以用户友好的格式展现出来。它是一个可靠高效的带宽监视和网速估测工具。 它能使用各种输入模块读取输入&#xff0c;并以各种输出模式显示输出…

计算机d盘无法格式化,四种方法解决D盘无法格式化问题

不少朋友系统出现故障&#xff0c;几乎都是选择重装系统的方法来解决问题。系统重装后&#xff0c;不少朋友觉得D盘没有什么重要的东西&#xff0c;就想将其格式化&#xff0c;可是系统出现windows无法格式该驱动器的提示&#xff0c;这是怎么回事呢&#xff1f;D盘无法格式化要…

sqlserver视图

作用 ①简化了操作&#xff0c;把经常使用的数据定义为视图。 ②安全性&#xff0c;用户只能查询和修改能看到的数据。 ③逻辑上的独立性&#xff0c;屏蔽了真实表的结构带来的影响。 对视图的修改&#xff1a;单表视图一般用于查询和修改&#xff0c;会改变基本表的数据&#…

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

文章目录1.本地安装 Fabric2.部署过程回顾3.完善项目配置4.修改 BASE_DIR 配置项5.设置 Supervisor 环境变量6.编写 Fabric 脚本7.执行 Fabric 自动部署脚本1.本地安装 Fabric $ pipenv install fabric --dev 报错&#xff1a; An error occurred while installing django-pure…

自断前程,未来80%IT工作将实现自动化

技术人员革了自己的命&#xff1f; 在上周的Structure大会上&#xff0c;硅谷著名风险投资人、亿万富翁唯诺德称未来80%的IT工作都将被AI系统所替代。不过&#xff0c;唯诺德好像并不担心&#xff0c;相反他补充了一句“我觉得很兴奋。”唯诺德表示自己并非危言耸听&#xff0c…

转://Linux Multipath多路径配置与使用案例

在Linux平台一部分存储产品使用操作系统自带的多路径软件&#xff0c;包括最常见的HP和IBM的部分存储产品&#xff0c;在Linux自带的多路径软件叫做multipath&#xff0c;这篇文章以HP EVA系列存储在Linux平台的使用为例&#xff0c;详细的在Linux平台配置和使用多路径。 那么问…

Windows中安装MongoDB以及studio3t

文章目录1.安装MongoDB2.配置并启动MongoDB3.使用studio3t连接mongodb1.安装MongoDB 运行 mongodb-win32-x86_64-2008plus-ssl-v3.4-latest-signed.msi 2.配置并启动MongoDB 创建几个文件夹具体如下&#xff1a; 1&#xff09;数据库路径&#xff08;data目录&#xff09; 2…

为旗下硬件产品服务,LG推出基于SLAM技术的3D摄像头

LG官方则表示&#xff0c;集成了LG的3D摄像头和SLAM技术的单个模块性价比很高。 今年3月份的时候&#xff0c;LG在MWC 2017上展示其和Valve合作的VR头显&#xff0c;最近他们宣布将基于AR公司Augmented Pixels的技术开发一个3D摄像头模块&#xff0c;来辅助他们的各种硬件产品…

VS工程切换cuda版本

在工程面板&#xff0c;切换到类视图&#xff0c;选中项目&#xff0c;右键菜单选择【生成自定义&#xff08;B&#xff09;…】&#xff0c;弹出下面窗口 在窗口勾选上CUDA版本&#xff0c;即可切换 转载于:https://www.cnblogs.com/xingzhensun/p/9154094.html

揭秘Microsoft Bing与Google搜索背后的故事

导读&#xff1a;Google搜索引擎已经赢得全球范围的赞誉&#xff0c;而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分&#xff0c;在后台支持Google算法的基础设施才是真正的幕后英雄&#xff0c;其基础设施可快速的索引链接成千上万台普…

计算机图画大赛作品六年级,打字能手显本领,电脑绘画展风采——记陆埠二小举行电脑绘画和电脑打字比赛...

为了提高小学生的计算机应用水平&#xff0c;培养学生动手能力和综合素质&#xff0c;提升学生的信息素养&#xff0c;2019年5月23日、24日中午&#xff0c;陆埠镇第二小学举行了三四年级电脑打字和五六年级电脑绘画比赛。本次比赛&#xff0c;3--6年级每班中选出3名学生参加&a…

变量在原型链中的查找顺序

js原型链 下面是一道js题目&#xff1a;[javascript] view plaincopy function C1(name){ if(name){ this.name name; } } function C2(name){ this.name name; } function C3(name){ this.name name || "John"; } C1.p…

基于SpringBoot + Vue的图书管理系统

功能概述 该图书管理系统提供了一系列功能&#xff0c;包括图书管理、图书类型管理、读者借阅归还图书、用户管理和重置密码等。 在图书管理功能中&#xff0c;管理员可以方便地进行图书信息的管理。他们可以添加新的图书记录&#xff0c;包括书名、作者、出版社、ISBN等信息&a…

交换机的工作转发原理

交换机通常是运行在网络OSI七层模型的第二层数据链路层&#xff0c;如图中&#xff0c;第三层网络层通常是路由器运行在该层 今天我们来看看&#xff0c;交换机的工作转发原理是什么样的。 交换机既然是利用端口进行网络数据传输&#xff0c;那么它是如何识别数据是谁给谁的呢…