Django之自带分页模块Pagination
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">« 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 »</a>
{% endif %}
</span>
</div>
Paginator
objects¶
该Paginator
班有这样的构造函数:
必需参数¶
object_list
-
QuerySet
带有count()
或__len__()
方法的列表,元组或其他可切片对象。对于一致的分页,QuerySet
应该对s进行排序,例如使用模型中的order_by()
子句或默认值ordering
。分散大
QuerySet
s的性能问题如果您使用的是
QuerySet
具有大量项目的项目,则在某些数据库上请求高页码可能会很慢,因为结果LIMIT
/OFFSET
查询需要计算OFFSET
在页码数越来越高时需要更长时间的 记录数。 per_page
- 页面上包含的最大项目数,不包括孤儿(请参阅
orphans
下面的可选参数)。
可选参数¶
orphans
- 如果您不希望最后一页包含很少的项目,请使用此选项。如果最后一页通常具有小于或等于的项目数
orphans
,那么这些项目将被添加到上一页面(成为最后一页),而不是将这些项目自己留在页面上。例如,有23个项目,per_page=10
和orphans=3
,将有两个页面; 第一页有10个项目,第二页(和最后一页)有13个项目。orphans
默认为零,这意味着页面永远不会合并,最后一页可能有一个项目。 allow_empty_first_page
- 是否允许第一页为空。如果为
False
和object_list
空,则会引发EmptyPage
错误。
InvalidPage
exceptions¶
Paginator.page()
如果请求的页面无效(即,不是整数)或不包含任何对象,则该方法引发异常。通常,它足以捕获InvalidPage
异常,但如果您想要更多粒度,则可以捕获以下任一异常:
这两个例外都是子类InvalidPage
,所以你可以用简单的方法处理它们。except InvalidPage
Page
objects¶
您通常不会Page
手工构建对象 - 您将使用它们Paginator.page()
。
- class
Page
(object_list,number,paginator)[source]¶ -
页面的作用类似于直接
Page.object_list
使用len()
或迭代它的顺序。
Methods¶
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
。
Django之自带分页模块Pagination的更多相关文章
- 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【进阶】分页功能Pagination
项目中,我们需要很多非业务逻辑的功能,例如分页功能,而且此类功能移植性很好,可以在不同的项目中使用,所以整理好这些功能会一定程度上提高开发效率,下面是分页功能代码,使用时,可单独放在utils目录 & ...
- Django内置的分页模块
自定义分页 未封装版: 优点:直观 缺点:代码乱,不易维护,可拓展性差 data = [] for i in range(1, 302): tmp = {"id": i, &quo ...
- Django实战(20):分页(Pagination)
在上一节我们实现了针对某个产品的订单订阅功能.但是我们可能需要直接在站点上查询所有的订单.显然,随着时间的增长订单会越来越多,所以分页(Pagination)是个好办法:每次只显示一部分订单. 分页是 ...
- Angular pagination分页模块 只提供分页参数处理 不处理分页记录数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- django分页模块--django-pure-pagination
Django自带有分页的两个类,但是用起来没有第三方这个分页模块方便,下面介绍一下这个模块的使用方法. 1. 安装模块: pip install django-pure-pagination 2. ...
- 26.Django模板语言和分页
继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...
- 4.Django模板语言和分页
继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...
- django高级应用(分页功能)
django高级应用(分页功能) 1.原生分页应用 前端html代码 <!DOCTYPE html> <html lang="en"> <head&g ...
随机推荐
- 设计模式系列之工厂模式三兄弟(Factory Pattern)
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- yaml读取封装
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 对yaml格式的配置文件的操作 """ ...
- Android学习笔记BroadcastReceiver(广播接收者)
Android发送广播的过程 代码实现 MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androi ...
- Dubbo——服务调用过程
文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...
- 关于单向循环链表的约瑟夫问题(Java实现)
关于单向循环链表的约瑟夫问题(Java实现) 最近在学习链表时,遇到单向循环链表中的约瑟夫问题.在构建循环链表的代码上,我有一点很不理解,遂记录下来. Josephu问题为: 设编号为1, 2,.. ...
- easymock案例2
public interface IStudent { public String doMethod1(); public String doMethod2(); public String doMe ...
- 【题解】[USACO17JAN]Balanced Photo G
题目链接:https://www.luogu.com.cn/problem/P3608 方法一 用树状数组求逆序对先后扫两遍,一次从前往后,一次从后往前,算出每头奶牛左右两边比她高的数量. 最后统计一 ...
- python字典套字典
定义字典 familyinfo = { "family name":"Python", "family structure":[ {&quo ...
- 基于小程序请求接口 wx.request 封装的类 axios 请求
基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...
- linux根据进程查端口,根据端口查进程
[root@test_environment src]# netstat -tnllup 能显示对应端口和进程 Active Internet connections (only servers) ...