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

这篇具有很好参考价值的文章主要介绍了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. 点击查看积分流水列表页面

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

 -------------------------------------------------end -------------------------------------------------文章来源地址https://www.toymoban.com/news/detail-744557.html

到了这里,关于Django实战项目-学习任务系统-查询列表分页显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django实战项目-学习任务系统-自定义URL拦截器

    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。 Django框架本身也有URL拦截器,但是因为本系统用户模型跟Django框架本身用户模

    2024年02月06日
    浏览(40)
  • 【Linux操作系统】探秘Linux奥秘:进程与任务管理的解密与实战

    🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《操作系统实验室》 🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS 🪐2 进程与任务管理的解密与实战 🌍1. 实验目的 🌍2. 实验准备 🌍3. 实验内容 🌍4. 实验心得 📝

    2024年02月03日
    浏览(50)
  • 【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架

    🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言: 你只管努力,剩下的交给时间! 在上篇文章中,本喵仅进行了单任务的DHT11温湿度传感器使用,相当于裸机使用。 根据上面时序图计算接收一次数据(5个字节)的耗时,不考虑主机发送起始信号的耗时: 最小时间

    2024年02月05日
    浏览(45)
  • 项目管理平台-01-jira 入门介绍 缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件

    Devops-01-devops 是什么? Devops-02-Jpom 简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件 代码质量管理 SonarQube-01-入门介绍 项目管理平台-01-jira 入门介绍 缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件 项目管理平台-01-Phabricator 入门介

    2024年03月21日
    浏览(52)
  • 基于大规模测量和多任务深度学习的电子鼻系统目标识别、浓度预测和状态判断

    为了实现响应特征的自动提取,简化模型的训练和应用过程,设计了一种双块知识共享结构的多任务卷积神经网络(MTL-CNN)来训练E-nose系统的模型。该模型可以同时执行三种不同的分类任务,用于目标识别、浓度预测和状态判断。 使用值为RA/RG (RA在空气中的电阻值,RG为在目

    2024年02月09日
    浏览(40)
  • Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

    关于Django,我已经和大家分享了一些知识,考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码,已经和本文章进行了绑定。大家可以自行下载学习,考虑到一些伙伴是初学者,几年前,编者也是从初学者一路学习到现在。当时,很希望有一套

    2024年02月20日
    浏览(42)
  • 复习之系统定时任务及延迟任务

    at  +时间 :具体时间设定延迟任务 设定成功后“ ctrl + d \\\"发起任务,\\\" ctrl + c \\\" 取消。 at  -l  :查看延迟任务 at  -c  1 :查看序号为1 的延迟任务的内容 at  -r  1 :取消序号为1 的延迟任务 at  now+1min : 设定1分钟后的延迟任务 ------------------------------------------------------实验-

    2024年02月16日
    浏览(41)
  • 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数

    上一课: 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核任务中断)、与硬件的关系实现 下一课: 【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量 1.1 任务概

    2024年02月04日
    浏览(47)
  • 任务40 评奖系统设计

    任务40 评奖系统设计 为教务处设计一个学生评价老师的程序: 每位学生投一张票,选出自己最喜爱的老师,选票格式为: | 第一喜爱的老师 | 第二喜爱的老师 |第三喜爱的老师 | | 工号 |工号 |工号 | 上述数据存放在一个数据文件中。 根据票中情况给老师记分,记分规则为:

    2024年02月07日
    浏览(37)
  • linux-系统定时任务cron

    cron是linux系统中以后台进程模式周期性地执行命令或指定程序任务地服务软件。默认安装完linux系统之后,cron服务软件便会启动,服务对应的进程名字为crond。corn服务会定期(默认每分钟检查一次)检查系统中是否有需要执行的任务工作计划。 cron工具对应的crontab命令依赖于

    2024年04月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包