Django之自带分页模块Pagination

Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,使用“上一页/下一页”连接。这些课程都在django/core/paginator.pyhtml

Example

Paginator对象的列表,再加上你想有每一个页面上的项目数,和它给你访问的每一个页面的项目方法:python

>>> 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已导入的 模型。数据库

视图函数以下所示:django

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,您须要在页面之间包含导航以及来自对象自己的任何有趣信息:less

{% 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">&laquo; 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 &raquo;</a>
        {% endif %}
    </span>
</div>

Paginator objects

Paginator班有这样的构造函数:函数

class Paginator object_list per_page orphans = 0 allow_empty_first_page = True [source]  ¶

必需参数

object_list

QuerySet带有count() 或__len__()方法的列表,元组或其余可切片对象对于一致的分页,QuerySet应该对s进行排序,例如使用模型中的order_by() 子句或默认值ordering性能

分散大QuerySets的性能问题ui

若是您使用的是QuerySet具备大量项目的项目,则在某些数据库上请求高页码可能会很慢,由于结果LIMITOFFSET查询须要计算OFFSET在页码数愈来愈高时须要更长时间的 记录数。this

per_page
页面上包含的最大项目数,不包括孤儿(请参阅 orphans 下面可选参数)。

可选参数

orphans
若是您不但愿最后一页包含不多的项目,请使用此选项。若是最后一页一般具备小于或等于的项目数 orphans ,那么这些项目将被添加到上一页面(成为最后一页),而不是将这些项目本身留在页面上。例如,有23个项目, per_page=10 和  orphans=3 ,将有两个页面; 第一页有10个项目,第二页(和最后一页)有13个项目。 orphans 默认为零,这意味着页面永远不会合并,最后一页可能有一个项目。
allow_empty_first_page
是否容许第一页为空。若是为 False 和  object_list 空,则会引起 EmptyPage 错误。

Methods

Paginator. get_page 编号 [来源]  ¶

返回Page具备给定的从1开始的索引对象,同时还处理超出范围和无效页码。spa

若是页面不是数字,则返回第一页。若是页码为负数或大于页数,则返回最后一页。

EmptyPage只有在指定为空时才会引起异常() Paginator(..., allow_empty_first_page=False)object_list

Paginator. page 编号 [来源]  ¶

返回Page具备给定的从1开始的索引对象。InvalidPage若是给定的页码不存在则引起 

Attributes

Paginator. count

全部页面中的对象总数。

注意

在肯定包含的对象数量时object_list, Paginator首先会尝试调用object_list.count()若是 object_list没有count()方法,那么Paginator将回退使用len(object_list)这容许诸如Django之类的对象在可用时QuerySet使用更有效的count()方法。

Paginator. num_pages

总页数。

Paginator. page_range

基于1的范围的页码迭代器,例如屈服[1, 2, 3, 4]

InvalidPage exceptions

异常 InvalidPage [来源]  ¶

分页器传递无效页码时引起的异常的基类。

Paginator.page()若是请求的页面无效(即,不是整数)或不包含任何对象,则方法引起异常。一般,它足以捕获InvalidPage异常,但若是您想要更多粒度,则能够捕获如下任一异常:

异常 PageNotAnInteger [来源]  ¶

page()赋值不是整数时引起。

异常 EmptyPage [来源]  ¶

page()给定有效值但在该页面上不存在对象时引起。

这两个例外都是子类InvalidPage,因此你能够用简单的方法处理它们except InvalidPage

Page objects

您一般不会Page手工构建对象 - 您将使用它们Paginator.page()

class Page object_list number paginator [source]  ¶

页面的做用相似于直接Page.object_list使用 len()或迭代它的顺序

Methods

Page. has_next () [来源]  ¶

True若是有下一页则返回

Page. has_previous () [来源]  ¶

True若是有上一页,则返回

Page. has_other_pages () [来源]  ¶

True若是有下一页上一页,返回

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

Attributes

Page. object_list

此页面上的对象列表。

Page. number

此页面的从1开始的页码。

Page. paginator

关联的Paginator对象。

相关文章
相关标签/搜索