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异常,一般这个异常就够用,如果需要更 详细信息,还有PageNotAnIntegerEmptyPage可用:

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相关的分页类

0 0