Django实战项目-学习任务系统-查询列表分页显示
接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。
接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。
本次增加查询列表分页显示功能,对一个查询列表功能进行分页改造,其他依此类推即可。
第一步:Django的分页器(paginator)简介
Django的分页器(paginator)是一个内置的分页组件,它可以方便地实现分页功能。当页面需要显示大量数据时,例如超过10000条,使用分页器可以提高阅读体验并减轻服务器压力。
要使用Django的分页器,首先需要从`django.core.paginator`模块中引入`Paginator`类以及相关的异常模块:`PageNotAnInteger`和`EmptyPage`。
`Paginator`是用于管理整个分页的逻辑,如控制总共有多少页、页码区间等。而`Page`类则是用来管理当前这个页面的一些属性。
以下是创建`Paginator`对象的简单语法:
```python
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
```
其中,`object_list`是你要分页的数据列表,`per_page`是每页显示的数据条数。
例如:
给 Paginator 一个对象列表,以及你希望在每个页面上拥有的项目数,它提供了访问每页项目的方法:
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4>>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results
第二步:修改视图文件
./mysite/study_system/views.py
def getStudyPointsList(request):'''@方法名称: 获取积分明细列表@作 者: PandaCode辉@weixin公众号: PandaCode辉@创建时间: 2023-10-10'''# 响应容器rsp_dict = {}# 获取当前用户名username = request.session.get('username')# 根据用户名获取用户对象cur_user = StudyUser.objects.get(username=username)print('根据用户名查询用户对象:' + str(cur_user))# 2. 获取要分页的数据集合(例如从数据库查询),当前用户的全部积分明细, .order_by('-created_time') 降序排列data_list = StudyPoint.objects.filter(user_id=cur_user).order_by('-created_time')# 3. 每页显示的数据数量items_per_page = 5# 4. 创建 Paginator 对象paginator = Paginator(data_list, items_per_page)# 5. 获取当前页数(从请求参数中获取,或者默认为第一页)current_page_num = request.GET.get('page', 1)'''1.整个数据表paginator.count 数据总数paginator.num_pages 总页数paginator.page_range 页码的列表2.当前页curuent_page.has_next() 是否有下一页curuent_page.next_page_number() 下一页的页码curuent_page.has_previous() 是否有上一页curuent_page.previous_page_number() 上一页的页码'''# 6. 获取当前页的数据对象try:current_page_data = paginator.page(current_page_num)except EmptyPage:# 处理页码超出范围的情况current_page_data = paginator.page(paginator.num_pages)# 获取整个表的总页数total_page = paginator.num_pagespag_range = []if total_page <= 11: # 判断当前页是否小于11个pag_range = paginator.page_rangeelif total_page > 11:if current_page_num < 6:pag_range = range(1, 11)elif current_page_num > paginator.num_pages - 5:pag_range = range(total_page - 9, total_page + 1)else:pag_range = range(current_page_num - 5, current_page_num + 5) # 当前页+5大于最大页数时# 7. 在模板中使用 current_data_page 来渲染分页数据# 查询待完成任务列表rsp_dict['data_list'] = data_listrsp_dict['paginator'] = paginatorrsp_dict['current_page_num'] = current_page_numrsp_dict['current_page_data'] = current_page_datarsp_dict['pag_range'] = pag_rangecontext_object_name = "study_points_list"template_name = "study_system/home.html"# 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;rsp_dict['html_file'] = 'study_system/item/studyPointsList.html'rsp_dict['context_object_name'] = context_object_namereturn render(request, template_name, rsp_dict)
第三步:修改页面模板代码
1. 积分流水列表页面
./mysite/study_system/templates/study_system/item/studyPointsList.html
<style type="text/css">table tr td {font-size: 1.5em;}
</style>
<!-- 结果显示区 -->
<div align="center"><table style='width: 100%;'><tr><td colspan="6" align="center">积分明细流水</td></tr><tr style="font-weight: bold; background: #FFEC8B;text-align: center"><td>序号</td><td>积分说明</td><td>交易类型</td><td>积分数</td><td>交易时间</td><td>用户名</td></tr>{% if current_page_data %}{% for studyPoints in current_page_data %}{% if studyPoints.point_type == 0 %}<tr style="color: blue;text-align: center">{# forloop.counter 可以记录循环的次数,作为列表序号#}<td>{{ forloop.counter }}</td><td>{{ studyPoints.point_name }}</td><td>兑换物品</td><td>{{ studyPoints.points_nums }}</td><td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}</td><td>{{ studyPoints.user_id.username }}</td></tr>{% elif studyPoints.point_type == 1 %}<tr style="color: red;text-align: center"><td>{{ forloop.counter }}</td><td>{{ studyPoints.point_name }}</td><td>成功奖励</td><td>{{ studyPoints.points_nums }}</td><td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}</td><td>{{ studyPoints.user_id.username }}</td></tr>{% elif studyPoints.point_type == 2 %}<tr style="color: green;text-align: center"><td>{{ forloop.counter }}</td><td>{{ studyPoints.point_name }}</td><td>失败处罚</td><td>{{ studyPoints.points_nums }}</td><td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}</td><td>{{ studyPoints.user_id.username }}</td></tr>{% endif %}{% endfor %}{% else %}<tr><td colspan="6" id="con_title">查无记录</td></tr>{% endif %}</table>
</div>
<div align="center">{% include "study_system/common/page.html" %}
</div>
2. 公共页码页面
./mysite/study_system/templates/study_system/common/page.html
<div><nav aria-label="Page navigation"><ul class="pagination">{% if not current_page_data.has_previous %}<!--判断是否有上一页--><li class="disable"><a href="#" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>{% else %}<li><a href="?page={{ current_page_data.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>{% endif %}{% for page_range in pag_range %}{% if current_page_num == page_range %}<!--判断遍历的页数是否为当前页,是就添加.avtive 背景色变蓝--><li class="active"><a href="?page={{ page_range }}">{{ page_range }}</a></li>{% else %}<li><a href="?page={{ page_range }}">{{ page_range }}</a></li>{% endif %}{% endfor %}{% if not current_page_data.has_next %}<!-- 判断是否最后一页 --><li class="disable"><a href="?page={{ current_page_num }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>{% else %}<li><a href="?page={{ current_page_data.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>{% endif %}</ul></nav>
</div>
第四步:运行测试
1. 点击查看积分流水列表页面

-------------------------------------------------end -------------------------------------------------
相关文章:
Django实战项目-学习任务系统-查询列表分页显示
接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。 本…...
Git 拉取指定TAG/分支的代码
像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。 1.创建 tag 标签 $ git tag <tagname&…...
2-爬虫-代理池搭建、代理池使用(搭建django后端测试)、爬取某视频网站、爬取某视频网站、bs4介绍和遍历文档树
1 代理池搭建 2 代理池使用 2.1 搭建django后端测试 3 爬取某视频网站 4爬取某视频网站 5 bs4介绍和遍历文档树 1 代理池搭建 # ip代理-每个设备都会有自己的IP地址-电脑有ip地址---》访问一个网站---》访问太频繁---》封ip-收费:靠谱稳定--提供api-免费ÿ…...
动手学深度学习——残差网络ResNet(原理解释+代码详解)
残差网络ResNet 1. 函数类2. 残差块3. ResNet模型4. 训练模型 ResNet为了解决“新添加的层如何提升神经网络的性能”,它在2015年的ImageNet图像识别挑战赛夺魁 它深刻影响了后来的深度神经网络的设计,ResNet的被引用量更是达到了19万。 1. 函数类 假…...
MYSQL 8.0 配置CDC(binlog)
CDC(Change Data Capture)即数据变更抓取,通过源端数据源开启CDC,ROMA Connect 可实现数据源的实时数据同步以及物理表的物理删除同步。这里介绍通过开启Binlog模式CDC功能。 注意:1、使用MYSQL8.0及以上版本。 2、不…...
软件测试/测试开发丨ChatGPT能否成为PPT最佳伴侣
点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中,无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT,协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等,可以给到观众更好…...
java对象的创建过程
一.类的加载与检查 当我们new了一个对象的时候,首先会去检查一下这个指令是否在常量池中存在符号引用,并且检查这个符号引用代表的对象是否被加载,解析初始化过,如果没有就要先去进行类加载过程 二.分配内存 我们通过第一步的检…...
Salesforce创建一个页面,能够配置各种提示语,而不需要修改代码
在Salesforce中创建一个页面,并使其能够配置各种提示语,可以使用自定义设置、自定义对象或自定义标签等方法来实现。以下是一种常见的方法: 自定义对象或自定义设置:您可以创建一个自定义对象或自定义设置来存储各种提示语的信息。…...
轻松管理MySQL权限:Python脚本带你飞
数据库管理是 IT 专家和开发者日常工作中的重要组成部分。一个合适的用户权限管理系统不仅确保了数据的安全性,还能确保数据能够按照预期的方式被正确地访问和修改。在本文中,我们将探讨如何使用 Python 脚本来管理和查询 MySQL 数据库中的用户权限。 用户权限管理:创建或修…...
Py之transformers_stream_generator:transformers_stream_generator的简介、安装、使用方法之详细攻略
Py之transformers_stream_generator:transformers_stream_generator的简介、安装、使用方法之详细攻略 目录 transformers_stream_generator的简介 1、Web Demo T1、original T2、stream transformers_stream_generator的安装 transformers_stream_generator的…...
2023年Zotero最新同步教程-使用TeraCloud的25G免费空间实时跨设备同步文献
文章目录 1. 前言2.1. 注册账号2.1.1. 填写注册信息2.1.2. 创建账号成功2.1.3. 注意2.2. 扩容空间2.3. 打开WebDAV 3. Zotero配置WebDAV同步3.1. 设置网址3.2. 验证服务器3.3. 文件同步成功 4. 结语 1. 前言 Zotero免费版的存储空间是300m,一个图文PDF动辄两三M&am…...
面试题:用宏定义写出swap(x,y),即交换两数。
鼠标选中查看答案↓: #define swap(x,y) do{(x)(x)(y);(y)(x)-(y);(x)(x)-(y);}while(0) 这个题考查宏定义的语法,尤其是多行代码的宏定义,加上do{}while(),,可以保证这些语句只执行一次。...
微服务框架SpringcloudAlibaba+Nacos集成RabbitMQ
目前公司使用jeepluscloud版本,这个版本没有集成消息队列,这里记录一下,集成的过程;这个框架跟ruoyi的那个微服务版本结构一模一样,所以也可以快速上手。 1.项目结构图: 配置类的东西做成一个公共的模块 …...
低代码开发,一场深度的IT效率革命
目录 一、前言 二、低代码迅速流行的理由 三、稳定性和生产率的最佳实践 四、程序员用低代码开发应用有哪些益处? 1、提升开发价值 2、利于团队升级 五、总结 一、前言 尽管IT技术支撑了全球的信息化浪潮,然而困扰行业已久的软件开发效率并未像摩尔定律那…...
虚拟串口软件使用介绍
对于上位机开发来说(特别是串口通信应用),上机位软件的调试尤为重要,但是上机位软件的调试并不关心硬件,只需要关注验证发送的数据帧的接收情况,为了便于调试,可以将上机位软件与串口软件互通,实现数据的交互,但由于互通需要串口,可以借助串口虚拟软件(VSPD),虚拟出…...
如何编写一份完整的软件测试报告?(进阶版)百分之90不知道
背景 作为测试从业者,编写测试用例,测试计划,测试报告都是必经之路,最近完成了年终述职以及版本准出,感觉测试报告或者各类报告真是职场人不可或缺的一项技能,趁着热乎劲🔥,写下一些…...
python企业微信小程序发送信息
python企业微信小程序发送信息 在使用下面代码之前先配置webhook 教程如下: https://www.bilibili.com/video/BV1oH4y1S7pN/?vd_sourcebee29ac3f59b719e046019f637738769 然后使用如下代码就可以发消息了: 代码如下: #codinggbk import r…...
Java入门篇 之 逻辑控制(练习题篇)
博主碎碎念: 练习题是需要大家自己打的请在自己尝试后再看答案哦; 个人认为,只要自己努力在将来的某一天一定会看到回报,在看这篇博客的你,不就是在努力吗,所以啊,不要放弃,路上必定坎坷&#x…...
Android Google登录并获取token(亲测有效)
背景: Android 需要用到Google的登录授权,用去token给到服务器,服务器再通过token去获取用户信息,实现第三方登录。 我们通过登录之后的email来获取token,不需要server_clientId;如果用server_clientId还…...
npm ERR! code ELIFECYCLE
问题: 一个老项目,现在想运行下,打不开了 npm install 也出错 尝试1 、使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install 还是不行 尝试2、 package.json 文件,去掉 那个插件 chorm…...
在MATLAB中调用与可视化Lingbot-Depth-Pretrain-ViTL-14的深度估计结果
在MATLAB中调用与可视化Lingbot-Depth-Pretrain-ViTL-14的深度估计结果 对于很多从事计算机视觉、机器人或者测绘相关研究的工程师和学者来说,深度估计是一个基础又关键的任务。它能从一张普通的二维图片中,推测出每个像素点距离相机的远近,…...
cobalt数据库设计解析:如何平衡性能与数据完整性
cobalt数据库设计解析:如何平衡性能与数据完整性 【免费下载链接】cobalt best way to save what you love 项目地址: https://gitcode.com/GitHub_Trending/cob/cobalt 引言:数据库设计的永恒矛盾 在软件开发领域,数据库设计始终面临…...
C#处理复杂JSON数据:Newtonsoft.Json多级嵌套反序列化实战(附避坑指南)
C#处理复杂JSON数据:Newtonsoft.Json多级嵌套反序列化实战(附避坑指南) 在当今数据驱动的开发环境中,JSON已成为事实上的数据交换标准。特别是对于C#开发者而言,处理来自API响应、配置文件或NoSQL数据库的复杂JSON结构…...
BG3ModManager模组管理工具完全指南
BG3ModManager模组管理工具完全指南 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 一、初识BG3ModManager BG3ModManager作为《博德之门3》的专用模组管理工具,为玩家提供…...
Arcgis符号化实战:用矢量文件制作专业级统计地图(附最新配色方案)
ArcGIS符号化实战:用矢量文件制作专业级统计地图(附最新配色方案) 当你面对一叠枯燥的表格数据时,是否想过如何让这些数字"活"起来?统计地图正是将抽象数据转化为直观视觉表达的利器。作为地理信息系统领域的…...
PyTorch 2.8镜像实际项目:电商短视频自动生成平台从0到1部署纪实
PyTorch 2.8镜像实际项目:电商短视频自动生成平台从0到1部署纪实 1. 项目背景与需求分析 电商行业正面临内容生产的巨大挑战。每天需要制作大量商品展示视频,传统方式需要专业团队拍摄剪辑,成本高、周期长、效率低。我们团队决定基于PyTorc…...
告别卡顿!用MobileNetv2+MPPTSNet-EC在树莓派上跑实时语义分割(附完整配置与性能测试)
树莓派实战:MobileNetv2MPPTSNet-EC实时语义分割全流程解析 当你在树莓派上第一次看到摄像头画面被实时分割成不同语义区域时,那种成就感绝对值得记录。本文将带你完整实现从模型选择到部署优化的全流程,用MobileNetv2MPPTSNet-EC这套组合拳&…...
从混淆矩阵到Kappa系数:实战解析土地利用分类精度评估全流程
1. 土地利用分类精度评估入门指南 当你完成了一张精美的土地利用分类图,最常被问到的问题往往是:"这个结果到底有多准?"作为从业多年的GIS分析师,我见过太多人只关注分类过程却忽视精度验证,最后在项目汇报时…...
解决JVM环境下的代码覆盖率难题:SimpleCov与JRuby完美兼容指南
解决JVM环境下的代码覆盖率难题:SimpleCov与JRuby完美兼容指南 【免费下载链接】simplecov Code coverage for Ruby with a powerful configuration library and automatic merging of coverage across test suites 项目地址: https://gitcode.com/gh_mirrors/si/…...
Freeswitch实战指南:核心命令与变量操作全解析
1. Freeswitch核心命令实战解析 第一次接触Freeswitch时,面对密密麻麻的命令行界面,我完全不知道从何下手。经过几个项目的实战积累,我发现掌握几个核心命令就能解决80%的日常需求。下面这些命令都是我踩过无数坑后总结出来的精华,…...
