Django实战项目-学习任务系统-查询列表分页显示

news2024/12/23 13:01:37

接着上期代码框架,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.coloradmin.cn/o/1162167.html

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

相关文章

Pinia介绍及简单示例

Pinia 是一个基于 Vue 3 的状态管理插件&#xff0c;旨在提供一种简单、直观的方式来管理应用程序的状态。与其他状态管理库&#xff08;如 Vuex&#xff09;相比&#xff0c;Pinia 更加轻量级、易于使用和可扩展。 Pinia 的主要特点包括&#xff1a; 1. 面向对象的 API&…

超低价:阿里云双11服务器优惠价格表_87元一年起

2023阿里云双十一优惠活动已经开启了&#xff0c;轻量2核2G服务器3M带宽优惠价87元一年、2核4G4M带宽优惠价165元一年&#xff0c;云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年&#xff0c;还有2核4G、2核8G、4核8G、4核16G、8核32G等配置报价&#xff0c;云服务器e…

发票识别神器:自动录入纸质发票信息

在如今数字化的时代&#xff0c;纸质发票的处理变得越来越繁琐和耗时。为了提高工作效率和减少人工错误&#xff0c;自动识别纸质发票信息的软件应运而生&#xff0c;如金鸣表格文字识别系统的“证票识别”识别功能。这类软件通过图像识别和智能算法&#xff0c;能够迅速准确地…

李宏毅机器学习笔记.Flow-based Generative Model(补)

文章目录 引子生成问题回顾&#xff1a;GeneratorMath BackgroundJacobian MatrixDeterminant 行列式Change of Variable Theorem简单实例一维实例二维实例 网络G的限制基于Flow的网络构架G的训练Coupling LayerCoupling Layer反函数计算Coupling Layer Jacobian矩阵计算Coupli…

5.6 TCP可靠传输的实现

思维导图&#xff1a; 5.6.1 TCP可靠传输的实现笔记概述 在TCP/IP模型中&#xff0c;第5.6节讨论了TCP如何通过滑动窗口机制来实现可靠传输。以下是对本节内容的笔记概括&#xff0c;以及关键点的简化解释&#xff1a; 滑动窗口&#xff08;Sliding Window&#xff09; 基本概…

按顺序判断对象a和b中第一个不同之处ax和bx【1】ax是否小于等于bx【2】不同处ax是否为空operator.le()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 按顺序判断对象a和b中 第一个不同之处ax和bx 【1】ax是否小于等于bx 【2】不同处ax是否为空 operator.le() [太阳]选择题 下列代码执行输出结果为True的个数为? import operator pr…

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容&#xff0c;还可以根据我们…

2023年【山东省安全员C证】考试资料及山东省安全员C证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试资料是安全生产模拟考试一点通生成的&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材汇编出山东省安全员C证仿真模拟考试。2023年【山东省安全员C证】考试资料及山东省…

免费记课时小程序-全优学堂

1. 教师使用小程序记上课 使用步骤 创建了员工账号&#xff0c;员工需设置为教师为班级进行排课使用系统账号绑定小程序&#xff0c;记上课 #1.1 创建员工账号 通过系统菜单’机构设置->员工管理‘&#xff0c;添加本机构教师及其他员工。 添加过程中&#xff0c;可设置…

excel制作透视表

场景描述&#xff1a; 有一张excel表&#xff0c;存在多条记录&#xff0c;现在需要把相同名称的商品的数量求和&#xff0c;放在一起展示 操作步骤&#xff1a; 删除最后一行数据 选中不显示分类汇总 以表格形式展示

Apache Pulsar 在腾讯云上的最佳实践

导语 由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕&#xff0c;本次活动大咖云集&#xff0c;来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起&#xff0c;深入探讨 Pulsar 在生产环境中的最佳应用实践&#x…

收藏 | 如何撰写数据分析报告?(附案例及数据源下载)

▲点击上方卡片关注我&#xff0c;回复“8”&#xff0c;加入数据分析领地&#xff0c;一起学习数据分析&#xff0c;持续更新数据分析学习路径相关资料~&#xff08;精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~&#xff09;回复“小飞象”&…

pycharm 断点调试python Flask

以flask框架为例&#xff0c;其启动命令为 python app.py runserver 后面需要拼接runserver 点击开始断点 参考&#xff1a;https://www.cnblogs.com/bigtreei/p/14742015.html

Mac之NVM|通过brew安装、更新、卸载、重新安装nvm

文章目录 导文通过brew安装NVM通过brew更新NVM通过brew卸载NVM通过brew重新安装NVM 导文 Mac之NVM 通过brew安装、更新、卸载、重新安装 通过brew安装NVM brew install nvm通过brew更新NVM brew upgrade nvm通过brew卸载NVM brew uninstall nvm通过brew重新安装NVM brew re…

Python 内嵌函数:它们有什么用处?

目录 创建 Python 内部函数使用内部函数&#xff1a;基础知识 提供封装构建助手内部函数使用内部辅助函数与私有辅助函数使用内部函数保留状态&#xff1a;闭包 在闭包中保留状态修改关闭状态使用内部函数添加行为&#xff1a;装饰器结论 一、说明 内部函数&#xff0c;也称为嵌…

分析订单每日营收、流量数据:

曝光率----》流量----->订单数 点击率&#xff1a;1000次广告展示&#xff0c;点击率10%意味着你可以获得100个流量&#xff08;就是访问产品页的人数&#xff09; &#xff08;下单&#xff09;转化率&#xff1a;转化率5%意味着你可以获得&#xff1a;流量的%5&#xff…

有方N58 HTTP POST 请求连接 TDengine

串口调试软件&#xff1a;格西调试精灵 第一步先注册网络获取IP地址 建立PPP连接 ATXIIC1\r PPP链路建立成功&#xff0c;查询IP地址 ATXIIC?\r 设置网络APN ATCREG?\r 运行结果&#xff0c;红线处是获…

跨境商城源码怎么部署

随着全球电子商务的快速发展&#xff0c;跨境商城已成为一种重要的商业模式。然而&#xff0c;要成功运营一个跨境商城&#xff0c;除了要有优秀的源码开发技术外&#xff0c;还需要进行合理的源码部署。本文将为您提供一份全面的跨境商城源码部署指南。 二、跨境商城源码选择 …

API管理平台搭建过程问题总结

API管理的定义和好处 API管理是指对应用程序编程接口&#xff08;API&#xff09;进行集中管理、监控和维护的过程。API是用于不同软件之间进行通信和交互的编程接口&#xff0c;通过API管理可以有效地管理和控制API的使用、访问和安全性。 API管理的好处包括&#xff1a; 1…

配送中心信息系统建设

配送中心信息系统的网络构成 配送中心最主要的信息系统为“物流管理信息系统”(WarehouseManagementsystem简称WMS)&#xff0c;物流管理信息系统的网络构成主要由主机系统设备、资料库主机、终端系统设备、无线终端网络设备和网络系统设备组成。将这些设备通过现代网络技术有…