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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos虚拟机安装配置与MobaXterm工具及Linux常用命令

目录 一、Centos操作系统 1.1 Centos介绍 1.2 Centos虚拟机安装 1.3 配置centos的镜像 1.4 虚拟机开机初始设置 1.4.1 查看网络配置 1.4.2 编辑网络配置 二、MobaXterm工具 2.1 MobaXterm介绍 2.2 MobaXterm安装 2.3 切换国内源 三、Linux常用命令和模式 3.1 查看网络配置 …

前端工程师的摸鱼日常(20)

今年一整年状态都不怎么好&#xff0c;所以别说摸鱼文了&#xff0c;其他技术文章都没写几篇&#xff0c;发生的事情有点多&#xff0c;无暇顾及这些&#xff0c;当然最主要的一个原因还是因为懒&#xff01; 有很多时候我都觉得人的大脑是单线程的&#xff0c;在处理一件事情…

Vue 事件绑定 和 修饰符

目录 一、事件绑定 1.简介 : 2.实例 : 二、修饰符 1.简介 : 2.实例 : 3.扩展 : 一、事件绑定 1.简介 : (1) 在Vue中&#xff0c;通过"v-on:事件名"可以绑定事件&#xff0c;eg : v-on:click表示绑定点击事件。 (2) 触发事件时调用的方法&#xff0c;定义在Vu…

HBase理论与实践-基操与实践

基操 启动&#xff1a; ./bin/start-hbase.sh 连接 ./bin/hbase shell help命令 输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细&#xff0c;要注意的是表名&#xff0c;行和列需要加引号。 建表&#xff0c;查看表&#xff0c;插入数据&#…

Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

目录 1、文章介绍 2、具体思路和写法 &#xff08;1&#xff09;AB包的打包 &#xff08;2&#xff09;AB包的加载 &#xff08;3&#xff09;AB包卸载 3、结语 1、文章介绍 本篇博客主要起记录和学习作用&#xff0c;简单的介绍一下AB包批量的打包和加载AB包的方式&…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

使用这些优秀的 iPad App 提升您的技术水平

还记得当年 iPad 隆重登场&#xff0c;每个人都对其改变游戏规则的潜力感到震惊吗&#xff1f;嗯&#xff0c;你猜怎么着&#xff1f;iPad 应用程序世界已经发展&#xff0c;我们为您精心挑选了最好的应用程序&#xff08;由 AVNation 提供&#xff09;。 1、Crestron Electro…

求解一个整数中含多少个1

1.问题描述&#xff1a;给定一个整数&#xff0c;统计其对应的二进制中含有1的个数。比如8(0000 1000),对应的二进制数中&#xff0c;只含有一个1. 2.设计思路&#xff1a;对x取余&#xff1a;zx%2。如果z&#xff01;0&#xff0c;说明x的末尾不是为1.对于一个二进制x4x3x2x1…

HHDBCS扩展数据库类型

为应对市面上的数据库种类繁多的问题&#xff0c;HHDBCS设置了扩展数据库功能。 在登陆界面点击“工具”&#xff0c;选择“扩展数据库类型”&#xff1b; 注&#xff1a;HHDBCS支持已kingbase&#xff0c;本文仅用来举例。 填入名称、所需数据库的信息&#xff0c;上传驱动…

【广州华锐互动】军用飞机VR实战训练系统

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统&#xff0c;正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术&#xff0c;为飞行员提供真实且逼真的模拟飞行环境&#xff0c;使之能够在…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式&#xff0c;具体来说&#xff0c;就是在不违背封装原则的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容&#xff1a;一部分是…

JS加密/解密之jsjiami在线js加密的效率问题

故事背景 ​ 经常有客户反馈&#xff0c;v7加密的效率比v6低&#xff0c;但是安全性更好。这里我给大家科普一下关于jsjiami的优化诀窍。 示例源代码 // 伪代码 while (1) {var name ‘张三’ }优化后 var _name 张三; while (1) {var name _name }优化原理 相信很多朋…

uni-app微信小程序打开第三方地图

需求 小程序中有个按钮点击以后会调用手机中第三方地图进行导航。参数 位置信息 经度 与纬度。 实现方法 uni.openLocation({latitude: Number(地址纬度),longitude: Number(地址经度),name: 地址名称,address: 地址详情,success: function (res) {console.log(打开系统位置地…

利用日期创建文件-多用于数据库的备份

功能&#xff1a;根据日期变化实现文件的创建 1&#xff09;知识点&#xff0c;date命令的用法 --date"n day ago" %Y%m%d #n天前&#xff0c;当天则可以去掉--date参数 2&#xff09;文件名的拼接 ${filename}${date} 3查看结果文件 后期学循环语句可以改一下…

计算机视觉基础——基于yolov5-face算法的车牌检测

文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…

Python画图之HelloKitty

Python-turtle画出HelloKitty&#xff08;有趣小游戏&#xff09; 一、效果图二、安装库1.常用镜像源2.库下载 三、Python代码 一、效果图 二、安装库 1.常用镜像源 1. 豆瓣http://pypi.douban.com/simple/ 2. 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple…

CentOS 搭建 Hadoop3 高可用集群

Hadoop FullyDistributed Mode 完全分布式 spark101spark102spark103192.168.171.101192.168.171.102192.168.171.103namenodenamenodejournalnodejournalnodejournalnodedatanodedatanodedatanodenodemanagernodemanagernodemanagerrecource managerrecource managerjob hist…

PostgreSQL 工具的相关介绍

1.1 psql工具 psql是PostgreSQL中的一个命令行交互式客户端工具&#xff0c;类似 Oracle中的命令行工具sqlplus&#xff0c;它允许用户交互地键入SQL语句或命 令&#xff0c;然后将其发送给PostgreSQL服务器&#xff0c;再显示SQL语句或命令的结 果。 1.2 psql的简单使用 使用…

elementUI树节点全选,反选,半选状态

// <template>部分 <div class"check-block"><el-divider></el-divider><el-checkbox :indeterminate"indeterminate" v-model"checkAll" change"handleCheckAllChange">全选</el-checkbox><e…
最新文章