Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。

基本语法

1
2
3
4
5
6
7
8
9
10
class Paginator(object):
    def __init__(self, object_list, per_page, orphans=0,
                 allow_empty_first_page=True):
        self.object_list = object_list
        self.per_page = int(per_page)
        self.orphans = int(orphans)
        self.allow_empty_first_page = allow_empty_first_page
……

基本语法实例

from django.core.paginator import Paginator
objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']
p = Paginator(objects,3) # 3条数据为一页,实例化分页对象
print(p.count) # 10 对象总共10个元素
print(p.num_pages) # 4 对象可分4页
print(p.page_range) # xrange(1, 5) 对象页的可迭代范围page1 = p.page(1) # 取对象的第一分页对象
print(page1.object_list) # 第一分页对象的元素列表['john', 'paul', 'george']
print(page1.number) # 第一分页对象的当前页值 1page2 = p.page(2) # 取对象的第二分页对象
print(page2.object_list) # 第二分页对象的元素列表 ['ringo', 'lucy', 'meiry']
print(page2.number) # 第二分页对象的当前页码值 2print(page1.has_previous()) # 第一分页对象是否有前一页 False
print(page1.has_other_pages()) # 第一分页对象是否有其它页 Trueprint(page2.has_previous()) # 第二分页对象是否有前一页 True
print(page2.has_next()) # 第二分页对象是否有下一页 True
print(page2.next_page_number()) # 第二分页对象下一页码的值 3
print(page2.previous_page_number()) # 第二分页对象的上一页码值 1
print(page2.start_index()) # 第二分页对象的元素开始索引 4
print(page2.end_index()) # 第2分页对象的元素结束索引 6

官方解释

在视图中的应用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)
    return render(request, 'list.html', {'contacts': contacts})

在template的html模板中的应用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br />
    ...
{% endfor %}
<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}
        <span class="current">
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        </span>
        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

分割线。。。。。

回归到easyadmin项目中,我们来定制自己的分页功能,当然数据的获取我们依旧通过对象来提取,但是难点在于href属性,我们要如何构造url是关键,因为我们的分页功能是在过滤功能的基础上,因此不能简单的使用?page=%s 格式,而且为了能得到更好的体验也迫使我们不得不重写分页功能

首先看下视图函数吧

def display_table_objs(request,app_name,table_name):admin_class = easy_admin.enabled_admins[app_name][table_name]object_list,filter_condtions = table_filter(request, admin_class)paginator = Paginator(object_list, admin_class.list_per_page)  # Show 25 contacts per pageprint(request.get_full_path())page = request.GET.get('page')try:object_list=paginator.page(page)except PageNotAnInteger:object_list=paginator.page(1)except EmptyPage:object_list=paginator.page(paginator.num_pages)return render(request,'easyadmin/display_table.html',{"admin_class":admin_class,"filter_condtions":filter_condtions,'object_list':object_list})

基本没有改动 接下来看下自定义标签

@register.simple_tag()
def easypaginator(request,object_list):"""now_page:当前页
        show_page:需要显示多少页num_pages:总共有多少页"""
    now_page=object_list.numbershow_page=6num_pages=object_list.paginator.num_pagesbase_url=""for k,v in request.GET.items():if k=='page':continueif v:base_url+="&%s=%s" %(k,v)if num_pages <= show_page:"""如果总页数小于需要展示的页数 那么久把所有的页码都打出来吧"""start_page=1end_page=num_pageselse:start_page = now_page - (show_page - 1) / 2end_page = now_page + (show_page - 1) / 2if start_page <= 0:start_page = 1end_page = start_page + show_page - 1if end_page >= num_pages:end_page = num_pagesstart_page = num_pages - show_page + 1str_list = []if now_page == 1:prevpage = '<li class="disabled"><a>上一页</a></li>'else:active_url="?page=%s" % str(now_page-1)prevpage = '<li><a href=%s>上一页</a></li>' %(active_url+base_url)if now_page == num_pages:lastpage = '<li class="disabled" ><a href="#">下一页</a></li>'else:active_url = "?page=%s" % str(now_page + 1)lastpage='<li><a class="" href=%s>下一页</a></li>' %(active_url+base_url)str_list.append(prevpage)for i in range(int(start_page), int(end_page + 1)):if i == now_page:active_url = "?page=%s" % str(i)tmp = '<li class="active" ><a href=%s >%s</a></li>' %(active_url+base_url,str(i))else:active_url = "?page=%s" % str(i)tmp = '<li class="" ><a href=%s >%s</a></li>' % (active_url + base_url, str(i))str_list.append(tmp)str_list.append(lastpage)omit='<li class="" ><a>....</a></li>'if num_pages > show_page:str_list.insert(int(len(str_list)/2),omit)str_list = mark_safe("".join(str_list))return str_list

  我们接受两个对象,一个request,一个是object_list也就是数据。那么我们可以获得哪些数据呢?总共的页数,当前页数,以及params,同时我们也可以设置需要显示多少页的内容,而不是显示100页或者更多,这样更符合人们的需求,这个值的改变不是很多我们就直接写在函数中,而不考虑写在baseadmin类中。通过params我们可以拼接url,通过当前页我们可以确定标签的样式,当然这都是基于bootsharp插件,当然如果不用bootsharp对分页功能完全不影响。

 <nav class="page pagination"><ul class="pagination">{% easypaginator request object_list %}</ul></nav>

效果:

转载于:https://www.cnblogs.com/tongchengbin/p/7697869.html

Django 分页 以及自定义分页相关推荐

  1. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  2. vxe-table vxe-pager 如何使用分页,自定义分页

    vxe-table 如何使用分页,自定义分页 表格和分页是两个不同的组件,可以搭配在一起使用,具体如下: <vxe-tableshow-overflowheight="200" ...

  3. Django—自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...

  4. ASP.NET 2.0在SQL Server 2005上自定义分页

    这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...

  5. mybatis常见分页技术和自定义分页原理实战

    文章目录 前言 mybatis简单了解 分页类型 分页方式 1.数组分页 2.数据库分页 3.Rowbounds分页 4.自定义插件分页 自定义分页原理 自定义分页实战 聊下第三方分页插件 pageH ...

  6. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  7. Django 分页组件替换自定义分页

    Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """c ...

  8. Django restframwork实现自定义数据格式的分页与搜索

    最近因为在做分页时遇到的问题很多,页浪费了好多时间,所以记录一下.以后如遇到可用省去不必要的麻烦 restframwork中的官方文档对分页和搜索页进行了详细的介绍,但是我公司需要的return的js ...

  9. 自定义分页(模块化)

    自定义分页 1.目的&环境准备 目的把分页写成一个模块的方式然后在需要分页的地方直接调用模块就行了. 环境准备Django中生成一个APP并且注册,配置URL&Views 配置URL ...

  10. Django内置的分页模块

    自定义分页 未封装版: 优点:直观 缺点:代码乱,不易维护,可拓展性差 data = []for i in range(1, 302):tmp = {"id": i, " ...

最新文章

  1. 解决修改properties 属性文件存在缓存问题,附带操作properties文件工具类
  2. 独家 | 教你用Scrapy建立你自己的数据集(附视频)
  3. 服务器运行jar包日志怎么清理,docker 启动jar包,并将日志文件进行挂载
  4. pbfunc外部扩展函数_从外部CorDapp扩展和覆盖流
  5. java创建一个不可变对象_使用不可变对象创建值对象
  6. 4.3.2 用jQuery进行异步加载(1)
  7. 应用编辑器保存的htnl代码怎么正常显示在页面上
  8. 分布式事务解决方案之TCC方案
  9. java导出到txt_Java生成TXT文本并下载
  10. 超详细的CMD文件讲解(DSP28035)
  11. 三星识别文字_Samsung OCR Software三星光学字符识别软件下载_Samsung OCR Software三星光学字符识别软件官方下载-太平洋下载中心...
  12. Word公式编辑大括号内公式对齐方法
  13. 内存设置无效: 内存预留 (sched.mem.min) 应该等于内存大小 (65536)
  14. 拉普拉斯变换与闭环系统稳定探讨
  15. linux文件下生成一个文件,Linux系统下生成一个指定大小的文件要注意什么?
  16. Java程序员的职业规划(五年)
  17. WiFi_Display_Spec
  18. P1000的使用感受
  19. spring、springboot集成 log4j日志、log4j2日志以及slf4j
  20. Unix、Linux、Mac与Win前世今生

热门文章

  1. Mathematics Base - 期望、方差、协方差、相关系数总结
  2. NGS中的一些软件功能介绍
  3. 机器学习分类问题中_训练数据类别不均衡怎么解决
  4. 科技庄园(背包dp)---对于蒟蒻来说死了一大片的奇题
  5. 计算机考研机试指南(九)——搜索(百鸡问题、ABC、胜利大逃亡、迷宫问题、C翻转、旋转矩阵、字符串匹配、)...
  6. 【EF】Entity Framework Core 2.0 特性介绍和使用指南
  7. Hadoop之倒排索引
  8. 为什么 HTTPS 比 HTTP 更安全?
  9. 蛋壳公寓斥资2亿美元全资收购长租公寓运营商爱上租
  10. linux自建git仓库