Django:使用Paginator进行自动分页
来源:互联网 发布:java程序员工作业绩 编辑:程序博客网 时间:2024/05/17 23:22
翻译自官方文档
分页机制¶
Django 1.0 中分页机制和先前已经大不相同。它提供了一些类协助你把数据分页。 对应的文件为 django/core/paginator.py
举例¶
类Paginator,带两个构造参数,一个就是数据的集合,另一个表示每页放几个数据。
[python] view plain copy
>>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2)
[python] view plain copy
>>> p.count 4 >>> p.num_pages 2 >>> p.page_range [1, 2]
[python] view plain copy
>>> page1 = p.page(1) >>> page1 <Page 1 of 2> >>> page1.object_list ['john', 'paul']
[python] view plain copy
在CODE上查看代码片派生到我的代码片
>>> 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() 3 >>> 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
[python] view plain copy
在CODE上查看代码片派生到我的代码片
>>> p.page(0) ... EmptyPage: That page number is less than 1 >>> p.page(3) ... EmptyPage: That page contains no results Note
Paginator 的第一个参数可以是list,tuple,QuerySet 或者任意对象————只要它 有 count() 或者 len() 函数。 Django后台会先尝试调用 count()。如果 不可行,再定要
len() 。
在视图中使用 Paginator¶
下面是一个复杂点的分页例子。也就是把查询子集在视图中分页显示。下面演示了如何结合视图 view,模板template来显示结果。前提是假设Contacts
model 已经被导入。
视图view 函数:
[python] view plain copy
在CODE上查看代码片派生到我的代码片
from django.core.paginator import Paginator, InvalidPage, EmptyPage
[python] view plain copy
在CODE上查看代码片派生到我的代码片
def listing(request): contact_list = Contacts.objects.all() paginator = Paginator(contact_list, 25) # Show 25 contacts per page # Make sure page request is an int. If not, deliver first page. try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 # If page request (9999) is out of range, deliver last page of results. try: contacts = paginator.page(page) except (EmptyPage, InvalidPage): contacts = paginator.page(paginator.num_pages) return render_to_response('list.html', {"contacts": contacts})
在模板文件 list.html 中,将显示每个对象的一些信息,以及导航标记。:
[html] view plain copy
在CODE上查看代码片派生到我的代码片
{% for contact in contacts.object_list %} {# 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>
构造函数:
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
必传参数
object_list
一个list,tuple,django的QuerySet,或者拥有count()
或__len__()
方法的 可分解对象。
per_page
每一页最大的对象个数。
可选参数
orphans
最后一页对象的最少数目,默认为0。 如果想避免最后一页显示太少。则可以使用这个值。 那么最后一页的数据,自动被前移一页。比如总共23个数据。每页显示 10. orphans=3 那么,第一页为10,第二页为13.
allow_empty_first_page
表示首页是否可以为空,如果是 False 而且object_list
为空,那么会触发 EmptyPage 异常。
方法
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Paginator.page(number)
根据索引number,返回一个’Page’对象,如果不存在,引起 InvalidPage异常
属性
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Paginator.count
所有对象的总数, 尝试通过object_list.count()
和object_list.__len__()
取得
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Paginator.num_pages
总共的页数
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Paginator.page_range
页的范围,比如 [1, 2, 3, 4] 。
InvalidPage 异常
当页面不存在或者无效时,会引起InvalidPage
异常,一般这个异常就够用,如果需要更 详细信息,还有PageNotAnInteger
,EmptyPage
可用:
PageNotAnInteger
page() 的参数非整数。
EmptyPage
page(x) ,第x页没数据。
上述两个都是 InvalidPage 的子类。 用一个简单的 except InvalidPage 就可以处理。
Page 类
Page(object_list, number, paginator):
一般不需用户自己构造,通过Paginator.page
生成。
方法
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.has_next()
如果下一页存在,返回True。
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.has_previous()
如果前一页存在返回 True
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.has_other_pages()
如果上一页面或者下一页存在,返回True
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.next_page_number()
返回下一页的索引,这个函数比较傻(不管下一页是否存在,都是简单的+1)
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.previous_page_number()
返回上一页的索引,其他同上
[html] view plain copy
在CODE上查看代码片派生到我的代码片
Page.start_index()
返回当前页,第一个对象的索引。
[python] view plain copy
在CODE上查看代码片派生到我的代码片
Page.end_index()
道理同上。
属性
Page.object_list
当前页对象列表
Page.number
当前页的索引
Page.paginator
和page相关的分页类
- Django:使用Paginator进行自动分页
- Django:使用Paginator进行自动分页
- django使用 Paginator 实现分页功能
- 使用Bootstrap Paginator分页插件进行分页
- django分页paginator
- python django paginator分页
- Django的分页 Paginator
- django Paginator分页模块
- Django分页与Paginator
- Django-paginator(分页)
- Django分页Paginator
- Django 1.11 使用paginator,Django自带分页器
- django分页技术Paginator(进阶篇)
- Django中扩展Paginator实现分页
- django 1.97 paginator实现分页功能
- Django(五)--分页器(paginator)
- Bootstrap Paginator 分页插件使用
- 使用bootstrap-paginator.js 分页来进行ajax 异步分页请求
- C语言------存储类说明符
- 计算机组成原理(一)
- 信息检索、分类系统的指标Recall,F,AUC及ROC
- 获取SD的大小及可用空间
- mycat安装
- Django:使用Paginator进行自动分页
- linux学习网站
- 【JAVA SE】15.封装+包
- VDMA IP的GUI配置介绍【Xilinx-VDMA模块学习】
- 浮点数的理解
- windows-pipe-进程间通信1
- 安装JDK,配置环境及安装eclipse
- 函数功能
- python模拟登录人人网