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_pages
pag_range = []
if total_page <= 11: # 判断当前页是否小于11个
pag_range = paginator.page_range
elif 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_list
rsp_dict['paginator'] = paginator
rsp_dict['current_page_num'] = current_page_num
rsp_dict['current_page_data'] = current_page_data
rsp_dict['pag_range'] = pag_range context_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_name return 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实战项目-学习任务系统-查询列表分页显示的更多相关文章
- LINQ 小项目【组合查询、分页】
使用 linq 在网页上对用户信息增删改,组合查询,分页显示 using System; using System.Collections.Generic; using System.Linq; us ...
- Django ---- blog项目学习所得
一.登录功能 1.采用ajax 提交form表单的方式 2.后台生成随机验证码,登录时提交验证码 3.用PLI库生成随机验证码,置于session中,登录时与前台提交的code进行upeer()的验证 ...
- 01-Flutter移动电商实战-项目学习记录
一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...
- Node.js实战项目学习系列(1) 初识Node.js
前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...
- Vuejs实战项目五:数据列表
1.在EasyMock 中添加数据列表模拟接口 请求url:/suyuan/list 请求方式:get 描述:数据列表 mock.js配置: 例: { "code": 2000, ...
- SpringMVC+Mybatis+Mysql实战项目学习--环境搭建
1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...
- Node.js实战项目学习系列(2) 开发环境和调试工具
前言 上一节让我们对Node.js有一个初步的了解,那么现在可以开始正式学习下Node.js的开发了,但是任何一门语言要设计到开发,就必须先学习开发环境以及调试.本文将主要讲解这些内容. 本文涉及到的 ...
- Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)
前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...
- Node.js实战项目学习系列(5) node基础模块 path
前言 前面已经学习了很多跟Node相关的知识,譬如开发环境.CommonJs,那么从现在开始要正式学习node的基本模块了,开始node编程之旅了. path path 模块提供用于处理文件路径和目录 ...
- 14、Django实战第14天:列表筛选功能
今天完成的是点击这些条件进行机构的筛选 首先来完成城市:当用户点击城市的时候,我们自动给它加一个参数(city.id) 编辑organization.views.py 刷新页面,发现筛选功能已经OK了 ...
随机推荐
- Qt编写地图综合应用27-点聚合
一.前言 在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症.为了解决这一问题,我们需要一种手段能在用户有限的可视区 ...
- SuperMap Objects中如何正确获取选择Selection以及提示“遇到一个未知错误,请重新打开窗口。ErrorMessage:尝试读取或写入受保护的内存。这通常指示他内存已损坏”
之前有一个项目中,首先在主线程(即UI线程)中通过Query()选择所需要的点几何对象记录集,然后将记录集转换为选择集,再刷新地图,从而实现将点几何对象选择并高亮显示的效果.随后通过另外一个工作线程在 ...
- JDK 19 Virtual Threads 虚拟线程
前言 Project Loom Loom 是什么? 为什么要引入 Loom? Virtual threads Platform thread 是什么? Virtual thread 是什么? Virt ...
- clip-retrieval检索本地数据集
clip-retrieval检索本地数据集 from clip_retrieval.clip_client import ClipClient, Modality from tqdm import t ...
- 回顾 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报
前言 今天咱们一起来回顾一下 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报,看看是否有适合你学习和参考的项目和框架. 简报初衷 公众号每月定期推广和分享的C#/.NE ...
- web40 无参数rce
点击查看代码 <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-04 00:12:34 # @Last Modi ...
- LeetCode刷题:343. 整数拆分的完全背包写法解析
dp的含义表示:从前i个数中挑选,满足和为j的最大乘积为多少.由于是乘积所以dp初始均为1.i为2开始是因为从1开始挑选,j为2开始应为有效数字是从2开始. 进一步空间优化,应为dp[i][j]只与其 ...
- 一款由 .NET 官方团队开源的电子商务系统 - eShop
项目介绍 eShop是一款由.NET官方开源的,基于.NET Aspire构建的用于参考学习的服务架构电子商务系统,旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站.该项目采用服 ...
- 首批!天翼云率先通过ITU国际标准认证!
近日,天翼云通过国内唯一人工智能云平台领域的ITU国际标准评估--中国信通院组织的ITU-T F.AICP-GA人工智能云平台技术规范国际标准和<智算工程平台能力要求>国内标准一致性评估, ...
- wsgi服务器
wsgi服务器DRP原则:Don't repeat yourself1.wsgi接口:全称 Web Server Gateway Interface (web服务器网关接口) 请求:request 响 ...