django Paginator 让分页变得完美
参考大佬地址:https://www.zmrenwu.com/courses/django-blog-tutorial/materials/21/
类视图
- from django.contrib.auth.decorators import login_required
- from django.utils.decorators import method_decorator
- from django.views.generic import ListView
- from base.models import Project, Sign, Environment, Interface, Case, Plan, Report
- @method_decorator(login_required, name='dispatch') # 类装饰器,需要用 method_decorator 包一下,并指定 类方法
- class ReportPage(ListView): # 继承ListView
- model = Report # 执行要查询的表名
- template_name = 'base/report_page/report_page.html' # 指定模板
- context_object_name = 'object_list' # 指定模板中使用的数据变量名称
- paginate_by = 10 # 一页多少条数据
- def dispatch(self, *args, **kwargs): # 重写dispatch 函数,供 method_decorator 指向这个函数
- return super(ReportPage, self).dispatch(*args, **kwargs)
- def get_queryset(self): # 重写查询,添加查询的条件等...
- self.plan_id = self.request.GET.dict().get('plan_id', '')
- if self.plan_id:
- return Report.objects.filter(plan_id=self.plan_id).order_by('-report_id') # 倒序返回
- else:
- return Report.objects.all().order_by('-report_id')
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context.update({'plan_id': self.plan_id}) # 在返回的字典中可以添加数据
- paginator = context.get('paginator')
- page = context.get('page_obj')
- is_paginated = context.get('is_paginated')
- data = pagination_data(paginator, page, is_paginated) # 接收处理好的分页数据
- context.update(data)
- return context
- pagination_data()函数 直接用的大佬的,没有做修改
- def pagination_data(paginator, page, is_paginated):
- if not is_paginated:
- # 如果没有分页,则无需显示分页导航条,不用任何分页导航条的数据,因此返回一个空的字典
- return {}
- # 当前页左边连续的页码号,初始值为空
- left = []
- # 当前页右边连续的页码号,初始值为空
- right = []
- # 标示第 1 页页码后是否需要显示省略号
- left_has_more = False
- # 标示最后一页页码前是否需要显示省略号
- right_has_more = False
- # 标示是否需要显示第 1 页的页码号。
- # 因为如果当前页左边的连续页码号中已经含有第 1 页的页码号,此时就无需再显示第 1 页的页码号,
- # 其它情况下第一页的页码是始终需要显示的。
- # 初始值为 False
- first = False
- # 标示是否需要显示最后一页的页码号。
- # 需要此指示变量的理由和上面相同。
- last = False
- # 获得用户当前请求的页码号
- page_number = page.number
- # 获得分页后的总页数
- total_pages = paginator.num_pages
- # 获得整个分页页码列表,比如分了四页,那么就是 [1, 2, 3, 4]
- page_range = paginator.page_range
- if page_number == 1:
- # 如果用户请求的是第一页的数据,那么当前页左边的不需要数据,因此 left=[](已默认为空)。
- # 此时只要获取当前页右边的连续页码号,
- # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 right = [2, 3]。
- # 注意这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
- right = page_range[page_number:page_number + 2]
- # 如果最右边的页码号比最后一页的页码号减去 1 还要小,
- # 说明最右边的页码号和最后一页的页码号之间还有其它页码,因此需要显示省略号,通过 right_has_more 来指示。
- if right[-1] < total_pages - 1:
- right_has_more = True
- # 如果最右边的页码号比最后一页的页码号小,说明当前页右边的连续页码号中不包含最后一页的页码
- # 所以需要显示最后一页的页码号,通过 last 来指示
- if right[-1] < total_pages:
- last = True
- elif page_number == total_pages:
- # 如果用户请求的是最后一页的数据,那么当前页右边就不需要数据,因此 right=[](已默认为空),
- # 此时只要获取当前页左边的连续页码号。
- # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 left = [2, 3]
- # 这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
- left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
- # 如果最左边的页码号比第 2 页页码号还大,
- # 说明最左边的页码号和第 1 页的页码号之间还有其它页码,因此需要显示省略号,通过 left_has_more 来指示。
- if left[0] > 2:
- left_has_more = True
- # 如果最左边的页码号比第 1 页的页码号大,说明当前页左边的连续页码号中不包含第一页的页码,
- # 所以需要显示第一页的页码号,通过 first 来指示
- if left[0] > 1:
- first = True
- else:
- # 用户请求的既不是最后一页,也不是第 1 页,则需要获取当前页左右两边的连续页码号,
- # 这里只获取了当前页码前后连续两个页码,你可以更改这个数字以获取更多页码。
- left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
- right = page_range[page_number:page_number + 2]
- # 是否需要显示最后一页和最后一页前的省略号
- if right[-1] < total_pages - 1:
- right_has_more = True
- if right[-1] < total_pages:
- last = True
- # 是否需要显示第 1 页和第 1 页后的省略号
- if left[0] > 2:
- left_has_more = True
- if left[0] > 1:
- first = True
- data = {
- 'left': left,
- 'right': right,
- 'left_has_more': left_has_more,
- 'right_has_more': right_has_more,
- 'first': first,
- 'last': last,
- }
- return data
html模板
- {% if is_paginated %}
- <ul class="pagination">
- {% if first %}
- <li class="page"><a href="?plan_id={{ plan_id }}&page=1">1</a></li>
- {% endif %}
- {% if left %}
- {% if left_has_more %}
- <li class="page"><a href="javascript:void(0)">...</a></li>
- {% endif %}
- {% for i in left %}
- <li class="page"><a href="?plan_id={{ plan_id }}&page={{ i }}">{{ i }}</a></li>
- {% endfor %}
- {% endif %}
- <li class="page"><a href="javascript:void(0)" class="active"> {{ page_obj.number }}</a></li>
- {% if right %}
- {% for i in right %}
- <li class="page"><a href="?plan_id={{ plan_id }}&page={{ i }}">{{ i }}</a></li>
- {% endfor %}
- {% if right_has_more %}
- <li class="page"><a href="javascript:void(0)">...</a></li>
- {% endif %}
- {% endif %}
- {% if last %}
- <li class="page"><a
- href="?plan_id={{ plan_id }}&page={{ paginator.num_pages }}">{{ paginator.num_pages }}</a>
- </li>
- {% endif %}
- </ul>
- {% endif %}
分页完成示例:
django Paginator 让分页变得完美的更多相关文章
- Django中扩展Paginator实现分页
Reference:https://my.oschina.net/kelvinfang/blog/134342 Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包.要在Dj ...
- django之快速分页
本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在dj ...
- Django内置分页
一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...
- Django中的分页,cookies与session
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- 利用rest-framework实现django应用的分页功能
自定义分页的类,继承 PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size ...
- django: django rest framework 分页
django: django rest framework 分页 2018年06月22日 13:41:43 linux_player_c 阅读数:665更多 所属专栏: django 实战 版权声 ...
- django视图之分页
在网站开发时,肯定会遇到分页的事情需要处理,在django中也是如此,在Django中处理分页一般会使用到两个类django.core.paginator.Paginator和django.core. ...
- 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 ...
- Django Paginator分页器
如何实现在django中实现分页效果,我使用的是django自带的分页器paginator具体是使用办法是这样的首先引用from django.core.paginator import Pagina ...
随机推荐
- web 多屏互动显示方案
1 基于 local storage 实现的信息传递 相关插件 lsbridge.js https://github.com/krasimir/l... 且项目中有非常简单易懂的示例你需要了解的一些关 ...
- 删除oracle居家必备
- ubuntu环境配置终极解答
1. ubuntu中常用的5个配置文件 1)/etc/profile 2)/etc/environment 环境变量在这个文件中定义,可以用vim /etc/environment查看该文件内容 3) ...
- go GTK msys2
1 下载安装msys2 MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境.同时它也是一个在Cygwin (POSIX 兼容性层) 和 ...
- Windows UI Library - Roadmap Win UI3.0
https://github.com/microsoft/microsoft-ui-xaml/blob/master/docs/roadmap.md 微软更新太快了.是不是要把开发人员折磨死.... ...
- flutter ListView列表和导航传值以及回调
main.dart import 'package:flutter/material.dart'; void main(){ return runApp(MyApp()); } class Produ ...
- office 安装破解
1. 打开Office Tool Plus.exe部署 2. 添加产品 `excel` `prowerpoint` `word` 3. 选择安装文件管理 选择下载安装 4.安装完成后点击开始部署 5. ...
- Flex TabNavigator
1.获取子项个数 TabNavigator.numChildren(int) 2.对于静态的TabNavigator的如何处理权限显示 for(var i:int=0;i <tab.numChi ...
- Linux 常用命令之 mv cp scp
1.mv 命令是move的缩写,用于文件(或文件夹)移动的. 1)将 luna 目录下的文件 a.txt,移动到 miracle 目录下: mv ./luna/a.txt ./miracle/ 2)将 ...
- django 数据库操作详解
Django配置使用mysql数据库 修改 settings.py 中的 DATABASES 注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建. DATABASES ...