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. Bash知识点记录

    变量的设置规则   1.  等号两边不能直接接空格符.   2. 右侧的变量内容若有空格符,可使用双引号或单引号将变量内容括起来,其中, 双引号内的特殊字符如 $ 等,可以保有原本的特性.如下所示: ...

  2. FWT,FST入门

    0.目录 目录 0.目录 1.什么是 FWT 2. FWT 怎么做 2.1. 或卷积 2.2.与卷积 2.3.异或卷积 2.4.例题 3. FST 3.1. FST 怎么做 3.2.例题 1.什么是 ...

  3. @uoj - 310@ 【UNR #2】黎明前的巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...

  4. @loj - 2106@ 「JLOI2015」有意义的字符串

    目录 @description@ @solution@ @accepted code@ @details@ @description@ B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣 ...

  5. 破解版BrupSuite安装及其问题解决及环境部署

    一 下载 BrupSuite_pro_v1.7.37的压缩包百度网盘链接: https://pan.baidu.com/s/1KkuseybjpuHo-6V4_wh9vw 提取码: 3vcs 说明一下 ...

  6. Spring Cloud Alibaba系列(四)使用gateway作为服务网关

    什么是网关 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计, ...

  7. ca70a_c++_重载函数_实参类型转换

    /*ca70a_c++_重载函数_实参类型转换转换等级,详见P290 编译选择哪个函数版本呢?1.精确匹配2.通过类型提升3.通过标准转换4.通过类类型转换参数匹配和枚举类型重载和const形参 vo ...

  8. SSH网上商城二

    1.实现的功能如下 当用户登陆成功之后,在首页显示所有的一级分类 显示热门商品 显示最新商品 当用户点击某个一级分类的菜单选项的时候,显示当前一级分类菜单项下所有的二级分类,并且按照分页的形式显示该二 ...

  9. Windows10系统下安装配置Tomcat 9.0.1

    Tomcat9.0.1下载:https://tomcat.apache.org/download-90.cgi 配置jdk的环境变量(略) 在系统变量里新建变量名:CATALINA_BASE,变量值: ...

  10. redis入门指南(二)—— 数据操作相关命令

    写在前面 以下绝大部分内容取材于<redis入门指南>,部分结合个人知识,实践后得出. 只记录重要,明确,属于新知的相关内容,杜绝冗余和重复. 字符串 1.字符串类型是redis中最常见的 ...