• 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 一个对象列表,以及你希望在每个页面上拥有的项目数,它提供了访问每页项目的方法:

    1. >>> from django.core.paginator import Paginator
    2. >>> objects = ['john', 'paul', 'george', 'ringo']
    3. >>> p = Paginator(objects, 2)
    4. >>> p.count
    5. 4
    6. >>> p.num_pages
    7. 2
    8. >>> type(p.page_range)
    9. <class 'range_iterator'>
    10. >>> p.page_range
    11. range(1, 3)
    12. >>> page1 = p.page(1)
    13. >>> page1
    14. <Page 1 of 2>
    15. >>> page1.object_list
    16. ['john', 'paul']
    17. >>> page2 = p.page(2)
    18. >>> page2.object_list
    19. ['george', 'ringo']
    20. >>> page2.has_next()
    21. False
    22. >>> page2.has_previous()
    23. True
    24. >>> page2.has_other_pages()
    25. True
    26. >>> page2.next_page_number()
    27. Traceback (most recent call last):
    28. ...
    29. EmptyPage: That page contains no results
    30. >>> page2.previous_page_number()
    31. 1
    32. >>> page2.start_index() # The 1-based index of the first item on this page
    33. 3
    34. >>> page2.end_index() # The 1-based index of the last item on this page
    35. 4
    36. >>> p.page(0)
    37. Traceback (most recent call last):
    38. ...
    39. EmptyPage: That page number is less than 1
    40. >>> p.page(3)
    41. Traceback (most recent call last):
    42. ...
    43. EmptyPage: That page contains no results

    第二步:修改视图文件
    ./mysite/study_system/views.py

    1. def getStudyPointsList(request):
    2. '''
    3. @方法名称: 获取积分明细列表
    4. @作 者: PandaCode辉
    5. @weixin公众号: PandaCode辉
    6. @创建时间: 2023-10-10
    7. '''
    8. # 响应容器
    9. rsp_dict = {}
    10. # 获取当前用户名
    11. username = request.session.get('username')
    12. # 根据用户名获取用户对象
    13. cur_user = StudyUser.objects.get(username=username)
    14. print('根据用户名查询用户对象:' + str(cur_user))
    15. # 2. 获取要分页的数据集合(例如从数据库查询),当前用户的全部积分明细, .order_by('-created_time') 降序排列
    16. data_list = StudyPoint.objects.filter(user_id=cur_user).order_by('-created_time')
    17. # 3. 每页显示的数据数量
    18. items_per_page = 5
    19. # 4. 创建 Paginator 对象
    20. paginator = Paginator(data_list, items_per_page)
    21. # 5. 获取当前页数(从请求参数中获取,或者默认为第一页)
    22. current_page_num = request.GET.get('page', 1)
    23. '''
    24. 1.整个数据表
    25. paginator.count 数据总数
    26. paginator.num_pages 总页数
    27. paginator.page_range 页码的列表
    28. 2.当前页
    29. curuent_page.has_next() 是否有下一页
    30. curuent_page.next_page_number() 下一页的页码
    31. curuent_page.has_previous() 是否有上一页
    32. curuent_page.previous_page_number() 上一页的页码
    33. '''
    34. # 6. 获取当前页的数据对象
    35. try:
    36. current_page_data = paginator.page(current_page_num)
    37. except EmptyPage:
    38. # 处理页码超出范围的情况
    39. current_page_data = paginator.page(paginator.num_pages)
    40. # 获取整个表的总页数
    41. total_page = paginator.num_pages
    42. pag_range = []
    43. if total_page <= 11: # 判断当前页是否小于11个
    44. pag_range = paginator.page_range
    45. elif total_page > 11:
    46. if current_page_num < 6:
    47. pag_range = range(1, 11)
    48. elif current_page_num > paginator.num_pages - 5:
    49. pag_range = range(total_page - 9, total_page + 1)
    50. else:
    51. pag_range = range(current_page_num - 5, current_page_num + 5) # 当前页+5大于最大页数时
    52. # 7. 在模板中使用 current_data_page 来渲染分页数据
    53. # 查询待完成任务列表
    54. rsp_dict['data_list'] = data_list
    55. rsp_dict['paginator'] = paginator
    56. rsp_dict['current_page_num'] = current_page_num
    57. rsp_dict['current_page_data'] = current_page_data
    58. rsp_dict['pag_range'] = pag_range
    59. context_object_name = "study_points_list"
    60. template_name = "study_system/home.html"
    61. # 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
    62. rsp_dict['html_file'] = 'study_system/item/studyPointsList.html'
    63. rsp_dict['context_object_name'] = context_object_name
    64. return render(request, template_name, rsp_dict)

    第三步:修改页面模板代码

    1. 积分流水列表页面
    ./mysite/study_system/templates/study_system/item/studyPointsList.html

    1. <style type="text/css">
    2. table tr td {
    3. font-size: 1.5em;
    4. }
    5. style>
    6. <div align="center">
    7. <table style='width: 100%;'>
    8. <tr>
    9. <td colspan="6" align="center">积分明细流水td>
    10. tr>
    11. <tr style="font-weight: bold; background: #FFEC8B;text-align: center">
    12. <td>序号td>
    13. <td>积分说明td>
    14. <td>交易类型td>
    15. <td>积分数td>
    16. <td>交易时间td>
    17. <td>用户名td>
    18. tr>
    19. {% if current_page_data %}
    20. {% for studyPoints in current_page_data %}
    21. {% if studyPoints.point_type == 0 %}
    22. <tr style="color: blue;text-align: center">
    23. {# forloop.counter 可以记录循环的次数,作为列表序号#}
    24. <td>{{ forloop.counter }}td>
    25. <td>{{ studyPoints.point_name }}td>
    26. <td>兑换物品td>
    27. <td>{{ studyPoints.points_nums }}td>
    28. <td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}td>
    29. <td>{{ studyPoints.user_id.username }}td>
    30. tr>
    31. {% elif studyPoints.point_type == 1 %}
    32. <tr style="color: red;text-align: center">
    33. <td>{{ forloop.counter }}td>
    34. <td>{{ studyPoints.point_name }}td>
    35. <td>成功奖励td>
    36. <td>{{ studyPoints.points_nums }}td>
    37. <td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}td>
    38. <td>{{ studyPoints.user_id.username }}td>
    39. tr>
    40. {% elif studyPoints.point_type == 2 %}
    41. <tr style="color: green;text-align: center">
    42. <td>{{ forloop.counter }}td>
    43. <td>{{ studyPoints.point_name }}td>
    44. <td>失败处罚td>
    45. <td>{{ studyPoints.points_nums }}td>
    46. <td>{{ studyPoints.created_time|date:'Y-m-d H:i:s' }}td>
    47. <td>{{ studyPoints.user_id.username }}td>
    48. tr>
    49. {% endif %}
    50. {% endfor %}
    51. {% else %}
    52. <tr>
    53. <td colspan="6" id="con_title">查无记录td>
    54. tr>
    55. {% endif %}
    56. table>
    57. div>
    58. <div align="center">
    59. {% include "study_system/common/page.html" %}
    60. div>

    2. 公共页码页面
    ./mysite/study_system/templates/study_system/common/page.html

    1. <div>
    2. <nav aria-label="Page navigation">
    3. <ul class="pagination">
    4. {% if not current_page_data.has_previous %}
    5. <li class="disable">
    6. <a href="#" aria-label="Previous">
    7. <span aria-hidden="true">上一页span>
    8. a>
    9. li>
    10. {% else %}
    11. <li>
    12. <a href="?page={{ current_page_data.previous_page_number }}" aria-label="Previous">
    13. <span aria-hidden="true">上一页span>
    14. a>
    15. li>
    16. {% endif %}
    17. {% for page_range in pag_range %}
    18. {% if current_page_num == page_range %}
    19. <li class="active"><a href="?page={{ page_range }}">{{ page_range }}a>li>
    20. {% else %}
    21. <li><a href="?page={{ page_range }}">{{ page_range }}a>li>
    22. {% endif %}
    23. {% endfor %}
    24. {% if not current_page_data.has_next %}
    25. <li class="disable">
    26. <a href="?page={{ current_page_num }}" aria-label="Next">
    27. <span aria-hidden="true">下一页span>
    28. a>
    29. li>
    30. {% else %}
    31. <li>
    32. <a href="?page={{ current_page_data.next_page_number }}" aria-label="Next">
    33. <span aria-hidden="true">下一页span>
    34. a>
    35. li>
    36. {% endif %}
    37. ul>
    38. nav>
    39. div>

    第四步:运行测试

    1. 点击查看积分流水列表页面

     -------------------------------------------------end -------------------------------------------------

  • 相关阅读:
    Django简单介绍
    web端三维重建算法-colmap++
    11.16堆的一些性质与操作
    (C++进阶) C++11
    TikTok营销攻略:如何精准测试与优化品牌营销策略
    小黑升级记----记ThinkPad470p加装固态盘
    1314. 矩阵区域和-矩阵前缀和算法
    PHP有关JWT(Json Web Token)的那些事
    上周热点回顾(8.29-9.4)
    七天速通javaSE:第四天 数组进阶
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/134176426