翻译自官方文档

分页机制¶

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的分页机制相关推荐

  1. Django快速分页

    分页 在web开发中,对大量的商品进行分页显示,是常见的需求,django对分页直接提供了现成的函数,让我们的开发更为快速便捷... 动图_Django快速分页 在后端(视图函数中) from dja ...

  2. : Android之linux基础教学之三 分页机制

    两个问题 : 1.为什么分页? 分页机制保证内存管理采用虚的方式,从而更加安全 . 2.为什么分N级? (0-(4G/1K == 4M)) 如果是只有一个普通的转换,那么 页转换表 需要  4M.就相 ...

  3. Linux2.6内核--内存管理(1)--分页机制

          在内核里分配内存可不像在其他地方分配内存那么容易.造成这种局面的因素很多.从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存.内核与用户空间不同,它不具备这种能力,它不支持简单便捷 ...

  4. 内存分段分页机制理解_深度干货 | 真棒! 20 张图揭开内存管理的迷雾,瞬间豁然开朗...

    openEA开源周刊 openEA开源社区的官方运营载体 这里每天给大家呈现有价值的开源资讯,欢迎您的来稿与推荐,点击上方蓝色字,加入我们吧! 摘要:本篇跟大家说说内存管理,内存管理还是比较重要的一个 ...

  5. 开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44

    开启分页机制 必须说明的是,必须在保护模式下才能启动分页功能.本章的引导程序依然用第13章的. 开启分页机制之前,必须创建页目录和页表.因为内核是在开启页功能之前加载的,段在内存中的位置已经固定.在这 ...

  6. x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42

    1. 为什么会有分页机制? 有些资料说是为了实现"虚拟内存",真的是这样吗?如果没有分页机制,能否实现"虚拟内存"?答案是肯定的. 当同时运行的任务很多时,内存 ...

  7. 详解Windows内存分页机制

    昨天新买了两本书, 看到了 内存分页 部分, 特此记录下, 没什么技术含量, 错误之处还请大牛指点. 大多数现代的操作系统都支持虚存, 这使得系统上的每个程序都拥有自己的地址空间. 每当程序读取内存时 ...

  8. JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)

    作者:JIURL 日期:2015年10月30日 分页机制 Linux(x64CPU)使用基于分页机制的虚拟内存.每个进程有256TB(48位)的虚拟地址空间.基于分页机制,这256TB地址空间的一些部 ...

  9. 【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码

    本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的内核汇编代码. ;代码清单16-1;文件名 ...

最新文章

  1. Mysql DBA 高级运维学习之路-mysql数据库入门知识
  2. LabVIEW2018安装教程
  3. 阻塞队列和ArrayBlockingQueue源码解析
  4. 推荐一些实用的的 Python 库
  5. C#基础12.1:Object类
  6. java代码实现购物车小程序_微信小程序实现购物车代码实例详解
  7. Linux/windows下java调用lingo
  8. NOI题库答案 (1.7 字符串基础)(21 - 25)
  9. 你的梦想是什么?灿星文化眼含热泪只想IPO
  10. jni in linux
  11. linux安装网卡驱动教程6,CentOS 6.5安装无线网卡驱动教程
  12. 互联网IT就业市场,你要说最有市场的一定是它,java面试常见笔试题
  13. 单反相机的照片删了如何恢复
  14. android会超过苹果,任正非:超过苹果和安卓的华为操作系统,不会超过三百年...
  15. python套用word模板_Python3操作Office之Word模板技术
  16. Java项目:SSH羽毛球馆管理系统
  17. 51单片机_11-2 蜂鸣器播放音乐
  18. 1.oracle查询周六周日的日期
  19. C语言BIM怎么编译,BIM模型建立的步骤
  20. 如何应对火车站强行乞讨的小孩

热门文章

  1. JAVA基础--java简单知识04(类与对象,封装,继承,多态)
  2. 记录一下git 打patch导入patch遇到的问题
  3. Latex实践:一个零Latex基础的术渣花了一天半的时间用Latex完成一篇SCI论文编辑
  4. Unity(协程是什么,怎么用)
  5. Nvidia Jetson Agx Xavier 在Ros中调用GMSL2相机
  6. 解决cascader级联选择器报错“level“ of null
  7. SQL Server修改表结构,表和列名加注释说明
  8. C语言课程设计 管理系统
  9. 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2
  10. Pytorch(gpu),cuda,cudnn安装