django的分页机制
翻译自官方文档
分页机制¶
Django 1.0 中分页机制和先前已经大不相同。它提供了一些类协助你把数据分页。 对应的文件为 django/core/paginator.py
举例¶
类Paginator,带两个构造参数,一个就是数据的集合,另一个表示每页放几个数据。
>>> from django.core.paginator import Paginator>>> objects = ['john', 'paul', 'george', 'ringo']>>> p = Paginator(objects, 2) >>> p.count4>>> p.num_pages2>>> p.page_range[1, 2] >>> 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()3>>> page2.previous_page_number()1>>> page2.start_index() # The 1-based index of the first item on this page3>>> page2.end_index() # The 1-based index of the last item on this page4 >>> 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 函数:
from django.core.paginator import Paginator, InvalidPage, EmptyPage 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 中,将显示每个对象的一些信息,以及导航标记。:
{% 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>
构造函数:
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 异常。
方法¶
Paginator.page(number)
根据索引number,返回一个’Page’对象,如果不存在,引起 InvalidPage异常
属性¶
Paginator.count
所有对象的总数, 尝试通过``object_list.count()``和``object_list.__len__()`` 取得
Paginator.num_pages
总共的页数
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` 生成。
方法¶
Page.has_next()
如果下一页存在,返回True。
Page.has_previous()
如果前一页存在返回 True
Page.has_other_pages()
如果上一页面或者下一页存在,返回``True``
Page.next_page_number()
返回下一页的索引,这个函数比较傻(不管下一页是否存在,都是简单的+1)
Page.previous_page_number()
返回上一页的索引,其他同上
Page.start_index()
返回当前页,第一个对象的索引。
Page.end_index()
道理同上。
属性¶
Page.object_list
当前页对象列表
Page.number
当前页的索引
Page.paginator
和page相关的分页类
django的分页机制相关推荐
- Django快速分页
分页 在web开发中,对大量的商品进行分页显示,是常见的需求,django对分页直接提供了现成的函数,让我们的开发更为快速便捷... 动图_Django快速分页 在后端(视图函数中) from dja ...
- : Android之linux基础教学之三 分页机制
两个问题 : 1.为什么分页? 分页机制保证内存管理采用虚的方式,从而更加安全 . 2.为什么分N级? (0-(4G/1K == 4M)) 如果是只有一个普通的转换,那么 页转换表 需要 4M.就相 ...
- Linux2.6内核--内存管理(1)--分页机制
在内核里分配内存可不像在其他地方分配内存那么容易.造成这种局面的因素很多.从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存.内核与用户空间不同,它不具备这种能力,它不支持简单便捷 ...
- 内存分段分页机制理解_深度干货 | 真棒! 20 张图揭开内存管理的迷雾,瞬间豁然开朗...
openEA开源周刊 openEA开源社区的官方运营载体 这里每天给大家呈现有价值的开源资讯,欢迎您的来稿与推荐,点击上方蓝色字,加入我们吧! 摘要:本篇跟大家说说内存管理,内存管理还是比较重要的一个 ...
- 开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44
开启分页机制 必须说明的是,必须在保护模式下才能启动分页功能.本章的引导程序依然用第13章的. 开启分页机制之前,必须创建页目录和页表.因为内核是在开启页功能之前加载的,段在内存中的位置已经固定.在这 ...
- x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42
1. 为什么会有分页机制? 有些资料说是为了实现"虚拟内存",真的是这样吗?如果没有分页机制,能否实现"虚拟内存"?答案是肯定的. 当同时运行的任务很多时,内存 ...
- 详解Windows内存分页机制
昨天新买了两本书, 看到了 内存分页 部分, 特此记录下, 没什么技术含量, 错误之处还请大牛指点. 大多数现代的操作系统都支持虚存, 这使得系统上的每个程序都拥有自己的地址空间. 每当程序读取内存时 ...
- JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)
作者:JIURL 日期:2015年10月30日 分页机制 Linux(x64CPU)使用基于分页机制的虚拟内存.每个进程有256TB(48位)的虚拟地址空间.基于分页机制,这256TB地址空间的一些部 ...
- 【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码
本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的内核汇编代码. ;代码清单16-1;文件名 ...
最新文章
- Mysql DBA 高级运维学习之路-mysql数据库入门知识
- LabVIEW2018安装教程
- 阻塞队列和ArrayBlockingQueue源码解析
- 推荐一些实用的的 Python 库
- C#基础12.1:Object类
- java代码实现购物车小程序_微信小程序实现购物车代码实例详解
- Linux/windows下java调用lingo
- NOI题库答案 (1.7 字符串基础)(21 - 25)
- 你的梦想是什么?灿星文化眼含热泪只想IPO
- jni in linux
- linux安装网卡驱动教程6,CentOS 6.5安装无线网卡驱动教程
- 互联网IT就业市场,你要说最有市场的一定是它,java面试常见笔试题
- 单反相机的照片删了如何恢复
- android会超过苹果,任正非:超过苹果和安卓的华为操作系统,不会超过三百年...
- python套用word模板_Python3操作Office之Word模板技术
- Java项目:SSH羽毛球馆管理系统
- 51单片机_11-2 蜂鸣器播放音乐
- 1.oracle查询周六周日的日期
- C语言BIM怎么编译,BIM模型建立的步骤
- 如何应对火车站强行乞讨的小孩
热门文章
- JAVA基础--java简单知识04(类与对象,封装,继承,多态)
- 记录一下git 打patch导入patch遇到的问题
- Latex实践:一个零Latex基础的术渣花了一天半的时间用Latex完成一篇SCI论文编辑
- Unity(协程是什么,怎么用)
- Nvidia Jetson Agx Xavier 在Ros中调用GMSL2相机
- 解决cascader级联选择器报错“level“ of null
- SQL Server修改表结构,表和列名加注释说明
- C语言课程设计 管理系统
- 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2
- Pytorch(gpu),cuda,cudnn安装