Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,使用“上一页/下一页”链接。这些课程都在django/core/paginator.py

Example

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

  

注意

请注意,您可以使用或方法提供Paginator列表/元组,Django QuerySet或任何其他对象。在确定传递的对象中包含的对象数时, 将首先尝试调用,然后如果传递的对象没有方法则回退到使用 。这允许诸如Django之类的对象 在可用时使用更有效的方法。count()__len__()Paginatorcount()len()count()QuerySetcount()

Paginator在视图中使用

这是一个稍微复杂的示例,用于Paginator在视图中对查询集进行分页。我们同时提供视图和附带的模板,以显示如何显示结果。此示例假定您具有Contacts已导入的 模型。

视图函数如下所示:

from django.core.paginator import Paginator
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')
contacts = paginator.get_page(page)
return render(request, 'list.html', {'contacts': contacts})

在模板中list.html,您需要在页面之间包含导航以及来自对象本身的任何有趣信息:

{% 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=1">&laquo; first</a>
<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>
<a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>

Paginator objects

Paginator班有这样的构造函数:

classPaginatorobject_listper_pageorphans = 0allow_empty_first_page = True[source]

必需参数

object_list

QuerySet带有count() 或__len__()方法的列表,元组或其他可切片对象。对于一致的分页,QuerySet应该对s进行排序,例如使用模型中的order_by() 子句或默认值ordering

分散大QuerySets的性能问题

如果您使用的是QuerySet具有大量项目的项目,则在某些数据库上请求高页码可能会很慢,因为结果LIMITOFFSET查询需要计算OFFSET在页码数越来越高时需要更长时间的 记录数。

per_page
页面上包含的最大项目数,不包括孤儿(请参阅orphans下面的可选参数)。

可选参数

orphans
如果您不希望最后一页包含很少的项目,请使用此选项。如果最后一页通常具有小于或等于的项目数orphans,那么这些项目将被添加到上一页面(成为最后一页),而不是将这些项目自己留在页面上。例如,有23个项目,per_page=10和 orphans=3,将有两个页面; 第一页有10个项目,第二页(和最后一页)有13个项目。orphans默认为零,这意味着页面永远不会合并,最后一页可能有一个项目。
allow_empty_first_page
是否允许第一页为空。如果为False和 object_list空,则会引发EmptyPage错误。

Methods

Paginator.get_page编号[来源]

返回Page具有给定的从1开始的索引的对象,同时还处理超出范围和无效页码。

如果页面不是数字,则返回第一页。如果页码为负数或大于页数,则返回最后一页。

EmptyPage只有在指定且为空时才会引发异常() 。Paginator(..., allow_empty_first_page=False)object_list

Paginator.page编号[来源]

返回Page具有给定的从1开始的索引的对象。InvalidPage如果给定的页码不存在则引发 。

Attributes

Paginator.count

所有页面中的对象总数。

注意

在确定包含的对象数量时object_list, Paginator首先会尝试调用object_list.count()。如果 object_list没有count()方法,那么Paginator将回退使用len(object_list)。这允许诸如Django之类的对象在可用时QuerySet使用更有效的count()方法。

Paginator.num_pages

总页数。

Paginator.page_range

基于1的范围的页码迭代器,例如屈服。[1, 2, 3, 4]

InvalidPage exceptions

异常InvalidPage[来源]

分页器传递无效页码时引发的异常的基类。

Paginator.page()如果请求的页面无效(即,不是整数)或不包含任何对象,则该方法引发异常。通常,它足以捕获InvalidPage异常,但如果您想要更多粒度,则可以捕获以下任一异常:

异常PageNotAnInteger[来源]

page()赋值不是整数时引发。

异常EmptyPage[来源]

page()给定有效值但在该页面上不存在对象时引发。

这两个例外都是子类InvalidPage,所以你可以用简单的方法处理它们。except InvalidPage

Page objects

您通常不会Page手工构建对象 - 您将使用它们Paginator.page()

classPageobject_listnumberpaginator[source]

页面的作用类似于直接Page.object_list使用 len()或迭代它的顺序。

Methods

Page.has_next()[来源]

True如果有下一页则返回。

Page.has_previous()[来源]

True如果有上一页,则返回。

Page.has_other_pages()[来源]

True如果有下一页上一页,则返回。

Page.next_page_number()[来源]

返回下一页编号。InvalidPage如果下一页不存在则引发。

Page.previous_page_number()[来源]

返回上一页编号。InvalidPage如果前一页不存在则引发。

Page.start_index()[来源]

返回页面上第一个对象的从1开始的索引,相对于分页器列表中的所有对象。例如,当为每页包含2个对象的5个对象的列表进行分页时,start_index()将返回第二个页面 3

Page.end_index()[来源]

返回页面上最后一个对象的从1开始的索引,相对于分页器列表中的所有对象。例如,当为每页包含2个对象的5个对象的列表进行分页时,end_index()将返回第二个页面 4

Attributes

Page.object_list

此页面上的对象列表。

Page.number

此页面的从1开始的页码。

Page.paginator

关联的Paginator对象。

Django之自带分页模块Pagination的更多相关文章

  1. 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 ...

  2. Django【进阶】分页功能Pagination

    项目中,我们需要很多非业务逻辑的功能,例如分页功能,而且此类功能移植性很好,可以在不同的项目中使用,所以整理好这些功能会一定程度上提高开发效率,下面是分页功能代码,使用时,可单独放在utils目录 & ...

  3. Django内置的分页模块

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

  4. Django实战(20):分页(Pagination)

    在上一节我们实现了针对某个产品的订单订阅功能.但是我们可能需要直接在站点上查询所有的订单.显然,随着时间的增长订单会越来越多,所以分页(Pagination)是个好办法:每次只显示一部分订单. 分页是 ...

  5. Angular pagination分页模块 只提供分页参数处理 不处理分页记录数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. django分页模块--django-pure-pagination

    Django自带有分页的两个类,但是用起来没有第三方这个分页模块方便,下面介绍一下这个模块的使用方法. 1. 安装模块: pip install django-pure-pagination 2.   ...

  7. 26.Django模板语言和分页

    继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...

  8. 4.Django模板语言和分页

    继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...

  9. django高级应用(分页功能)

    django高级应用(分页功能) 1.原生分页应用 前端html代码 <!DOCTYPE html> <html lang="en"> <head&g ...

随机推荐

  1. 04 . Docker安全与Docker底层实现

    Docker安全 Docker安全性时,主要考虑三个方面 # 1. 由内核的名字空间和控制组机制提供的容器内在安全 # 2. Docker程序(特别是服务端)本身的抗攻击性 # 3. 内核安全性的加强 ...

  2. Java中的map集合顺序如何与添加顺序一样

    一般使用map用的最多的就是hashmap,但是hashmap里面的元素是不按添加顺序的,那么除了使用hashmap外,还有什么map接口的实现类可以用呢? 这里有2个,treeMap和linkedH ...

  3. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  4. Shiro简单加密服务

    编码/加密 在涉及到密码存储问题上,应该加密 / 生成密码摘要存储,而不是存储明文密码.比如之前的 600w csdn 账号泄露对用户可能造成很大损失,因此应加密 / 生成不可逆的摘要方式存储. Sh ...

  5. Spring Boot项目使用Swagger2文档教程

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 前言 Sprin ...

  6. vscode启动vue项目出错,给了管理员权限没用

    今天在安装vue环境测试项目的时候, 发现vscode调用终端异常,语句无法运行,百度上给的解决方法是给管理员权限 给了以后发现没用,怎么试都没用,然后想到了,重启大法,然后问题就完美解决了

  7. 用Python进行实时计算——PyFlink快速入门

    Flink 1.9.0及更高版本支持Python,也就是PyFlink. 在最新版本的Flink 1.10中,PyFlink支持Python用户定义的函数,使您能够在Table API和SQL中注册和 ...

  8. nginx 注释配置及详解

    前言 DMZ(Demilitarized Zone) 非军事区,生产环境 WEB 服务部署的区域,公司的架构为一台nginx 充当 load balance 服务,负载到两台 nginx 上面,反向代 ...

  9. python冷知识(续)

    python 冷知识 1.交互式中修改最大递归深度 大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出. 那到底,默认递归次数限制是多少呢? 可以使用sys这个库来查看 >>&g ...

  10. FreeMarkerz在List中取任意一条数据的某一个值

    首先你要知道要取的数据的下标 <#list itemsList as item> <#if item_index==1> <#if "${item.value} ...