参考大佬地址:https://www.zmrenwu.com/courses/django-blog-tutorial/materials/21/

类视图

  1. from django.contrib.auth.decorators import login_required
  2. from django.utils.decorators import method_decorator
  3. from django.views.generic import ListView
  4. from base.models import Project, Sign, Environment, Interface, Case, Plan, Report
  5.  
  6. @method_decorator(login_required, name='dispatch') # 类装饰器,需要用 method_decorator 包一下,并指定 类方法
  7. class ReportPage(ListView): # 继承ListView
  8. model = Report # 执行要查询的表名
  9. template_name = 'base/report_page/report_page.html' # 指定模板
  10. context_object_name = 'object_list' # 指定模板中使用的数据变量名称
  11. paginate_by = 10 # 一页多少条数据
  12.  
  13. def dispatch(self, *args, **kwargs): # 重写dispatch 函数,供 method_decorator 指向这个函数
  14. return super(ReportPage, self).dispatch(*args, **kwargs)
  15.  
  16. def get_queryset(self): # 重写查询,添加查询的条件等...
  17. self.plan_id = self.request.GET.dict().get('plan_id', '')
  18. if self.plan_id:
  19. return Report.objects.filter(plan_id=self.plan_id).order_by('-report_id') # 倒序返回
  20. else:
  21. return Report.objects.all().order_by('-report_id')
  22.  
  23. def get_context_data(self, **kwargs):
  24. context = super().get_context_data(**kwargs)
  25. context.update({'plan_id': self.plan_id}) # 在返回的字典中可以添加数据
  26. paginator = context.get('paginator')
  27. page = context.get('page_obj')
  28. is_paginated = context.get('is_paginated')
  29. data = pagination_data(paginator, page, is_paginated) # 接收处理好的分页数据
  30. context.update(data)
  31. return context
  1. pagination_data()函数 直接用的大佬的,没有做修改
  1. def pagination_data(paginator, page, is_paginated):
  2. if not is_paginated:
  3. # 如果没有分页,则无需显示分页导航条,不用任何分页导航条的数据,因此返回一个空的字典
  4. return {}
  5.  
  6. # 当前页左边连续的页码号,初始值为空
  7. left = []
  8.  
  9. # 当前页右边连续的页码号,初始值为空
  10. right = []
  11.  
  12. # 标示第 1 页页码后是否需要显示省略号
  13. left_has_more = False
  14.  
  15. # 标示最后一页页码前是否需要显示省略号
  16. right_has_more = False
  17.  
  18. # 标示是否需要显示第 1 页的页码号。
  19. # 因为如果当前页左边的连续页码号中已经含有第 1 页的页码号,此时就无需再显示第 1 页的页码号,
  20. # 其它情况下第一页的页码是始终需要显示的。
  21. # 初始值为 False
  22. first = False
  23.  
  24. # 标示是否需要显示最后一页的页码号。
  25. # 需要此指示变量的理由和上面相同。
  26. last = False
  27.  
  28. # 获得用户当前请求的页码号
  29. page_number = page.number
  30.  
  31. # 获得分页后的总页数
  32. total_pages = paginator.num_pages
  33.  
  34. # 获得整个分页页码列表,比如分了四页,那么就是 [1, 2, 3, 4]
  35. page_range = paginator.page_range
  36.  
  37. if page_number == 1:
  38. # 如果用户请求的是第一页的数据,那么当前页左边的不需要数据,因此 left=[](已默认为空)。
  39. # 此时只要获取当前页右边的连续页码号,
  40. # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 right = [2, 3]。
  41. # 注意这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
  42. right = page_range[page_number:page_number + 2]
  43.  
  44. # 如果最右边的页码号比最后一页的页码号减去 1 还要小,
  45. # 说明最右边的页码号和最后一页的页码号之间还有其它页码,因此需要显示省略号,通过 right_has_more 来指示。
  46. if right[-1] < total_pages - 1:
  47. right_has_more = True
  48.  
  49. # 如果最右边的页码号比最后一页的页码号小,说明当前页右边的连续页码号中不包含最后一页的页码
  50. # 所以需要显示最后一页的页码号,通过 last 来指示
  51. if right[-1] < total_pages:
  52. last = True
  53.  
  54. elif page_number == total_pages:
  55. # 如果用户请求的是最后一页的数据,那么当前页右边就不需要数据,因此 right=[](已默认为空),
  56. # 此时只要获取当前页左边的连续页码号。
  57. # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 left = [2, 3]
  58. # 这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
  59. left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
  60.  
  61. # 如果最左边的页码号比第 2 页页码号还大,
  62. # 说明最左边的页码号和第 1 页的页码号之间还有其它页码,因此需要显示省略号,通过 left_has_more 来指示。
  63. if left[0] > 2:
  64. left_has_more = True
  65.  
  66. # 如果最左边的页码号比第 1 页的页码号大,说明当前页左边的连续页码号中不包含第一页的页码,
  67. # 所以需要显示第一页的页码号,通过 first 来指示
  68. if left[0] > 1:
  69. first = True
  70. else:
  71. # 用户请求的既不是最后一页,也不是第 1 页,则需要获取当前页左右两边的连续页码号,
  72. # 这里只获取了当前页码前后连续两个页码,你可以更改这个数字以获取更多页码。
  73. left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
  74. right = page_range[page_number:page_number + 2]
  75.  
  76. # 是否需要显示最后一页和最后一页前的省略号
  77. if right[-1] < total_pages - 1:
  78. right_has_more = True
  79. if right[-1] < total_pages:
  80. last = True
  81.  
  82. # 是否需要显示第 1 页和第 1 页后的省略号
  83. if left[0] > 2:
  84. left_has_more = True
  85. if left[0] > 1:
  86. first = True
  87.  
  88. data = {
  89. 'left': left,
  90. 'right': right,
  91. 'left_has_more': left_has_more,
  92. 'right_has_more': right_has_more,
  93. 'first': first,
  94. 'last': last,
  95. }
  96.  
  97. return data

html模板

  1. {% if is_paginated %}
  2. <ul class="pagination">
  3. {% if first %}
  4. <li class="page"><a href="?plan_id={{ plan_id }}&page=1">1</a></li>
  5. {% endif %}
  6. {% if left %}
  7. {% if left_has_more %}
  8. <li class="page"><a href="javascript:void(0)">...</a></li>
  9. {% endif %}
  10. {% for i in left %}
  11. <li class="page"><a href="?plan_id={{ plan_id }}&page={{ i }}">{{ i }}</a></li>
  12. {% endfor %}
  13. {% endif %}
  14. <li class="page"><a href="javascript:void(0)" class="active"> {{ page_obj.number }}</a></li>
  15. {% if right %}
  16. {% for i in right %}
  17. <li class="page"><a href="?plan_id={{ plan_id }}&page={{ i }}">{{ i }}</a></li>
  18. {% endfor %}
  19. {% if right_has_more %}
  20. <li class="page"><a href="javascript:void(0)">...</a></li>
  21. {% endif %}
  22. {% endif %}
  23. {% if last %}
  24. <li class="page"><a
  25. href="?plan_id={{ plan_id }}&page={{ paginator.num_pages }}">{{ paginator.num_pages }}</a>
  26. </li>
  27. {% endif %}
  28.  
  29. </ul>
  30. {% endif %}

分页完成示例:

django Paginator 让分页变得完美的更多相关文章

  1. Django中扩展Paginator实现分页

    Reference:https://my.oschina.net/kelvinfang/blog/134342 Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包.要在Dj ...

  2. django之快速分页

    本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在dj ...

  3. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  4. Django中的分页,cookies与session

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  5. 利用rest-framework实现django应用的分页功能

    自定义分页的类,继承 PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size ...

  6. django: django rest framework 分页

    django: django rest framework 分页 2018年06月22日 13:41:43 linux_player_c 阅读数:665更多 所属专栏: django 实战   版权声 ...

  7. django视图之分页

    在网站开发时,肯定会遇到分页的事情需要处理,在django中也是如此,在Django中处理分页一般会使用到两个类django.core.paginator.Paginator和django.core. ...

  8. django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页

    一.视图CBV 1.urls url(r'^login.html$', views.Login.as_view()), 2.views from django.views import View cl ...

  9. Django Paginator分页器

    如何实现在django中实现分页效果,我使用的是django自带的分页器paginator具体是使用办法是这样的首先引用from django.core.paginator import Pagina ...

随机推荐

  1. web 多屏互动显示方案

    1 基于 local storage 实现的信息传递 相关插件 lsbridge.js https://github.com/krasimir/l... 且项目中有非常简单易懂的示例你需要了解的一些关 ...

  2. 删除oracle居家必备

  3. ubuntu环境配置终极解答

    1. ubuntu中常用的5个配置文件 1)/etc/profile 2)/etc/environment 环境变量在这个文件中定义,可以用vim /etc/environment查看该文件内容 3) ...

  4. go GTK msys2

    1 下载安装msys2 MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境.同时它也是一个在Cygwin (POSIX 兼容性层) 和 ...

  5. Windows UI Library - Roadmap Win UI3.0

    https://github.com/microsoft/microsoft-ui-xaml/blob/master/docs/roadmap.md 微软更新太快了.是不是要把开发人员折磨死.... ...

  6. flutter ListView列表和导航传值以及回调

    main.dart import 'package:flutter/material.dart'; void main(){ return runApp(MyApp()); } class Produ ...

  7. office 安装破解

    1. 打开Office Tool Plus.exe部署 2. 添加产品 `excel` `prowerpoint` `word` 3. 选择安装文件管理 选择下载安装 4.安装完成后点击开始部署 5. ...

  8. Flex TabNavigator

    1.获取子项个数 TabNavigator.numChildren(int) 2.对于静态的TabNavigator的如何处理权限显示 for(var i:int=0;i <tab.numChi ...

  9. Linux 常用命令之 mv cp scp

    1.mv 命令是move的缩写,用于文件(或文件夹)移动的. 1)将 luna 目录下的文件 a.txt,移动到 miracle 目录下: mv ./luna/a.txt ./miracle/ 2)将 ...

  10. django 数据库操作详解

    Django配置使用mysql数据库 修改 settings.py 中的 DATABASES  注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建. DATABASES ...