分页:
Paginator 类对象的属性:
num_pages: 返回分页之后的总页数
page_range: 返回分页后页码的列表
Paginator 类对象的方法:
page(self, number): 返回第 number 页的 Page 类实例对象
Page 类对象的属性:
number: 返回当前页的页码
object_list: 返回包含当前页的数据的查询集
paginator: 返回对应得 Paginator 类对象
Page 类对象的方法:
has_previous: 判断当前页是否有前一页
has_next: 判断当前页是否有下一页
previous_page_number: 返回前一页的页码
next_page_number: 返回下一页的页码
实例:
from django.conf.urls import url
urlpatterns = [
url(r'^show_area(?P<pindex>\d+))', views.show_area)
]
def show_area(request, pindex):
# 1. 查询处所有省级地区的信息
areas = AreaInfo.objects.filter(aParent_isnull=True)
# 2. 分页, 每页显示10条数据: 即: 创建 Paginator 类的实例对象
my_paginator = Paginator(areas, 10)
# 打印出一共多少页
print(my_paginator.num_pages)
# 打印出所有页码
print(my_paginator.page_range)
# 3. 获取第 pindex 页的内容
# page 是 Page 类的实例对象
if pindex == '':
pindex = 1
else:
pindex = int(pindex)
page = my_paginator.page(pindex)
# 打印当前页的页码
print(page.number)
# 4. 使用模版
return render(request, 'booktext/show_area.html', {'page': page})
<body>
<ul>
{% for area in page.object_list %}
// 上下两者等效
// 循环显示 当前页的所有对象
{% for area in page %}
<li>{{ area.atitle }}</li>
{% endfor %}
</ul>
<ul>
// 判断是否有上一页
{% if page.has_previous %}
<a href="/show_area{{page.previous_page_number}}">上一页</a>
{% endif %}
{% for pindex in page.paginator.pgae_range %}
{% if pindex == page.number %}
// 如果是当前页
{{pindex}}
{% else %}
<a href='show_area{{ pindex }}'></a>
{% endif %}
{% endfor %}
// 判断是否有下一页
{% if page.has_next %}
<a href="/show_area{{page.next_page_number}}">下一页</a>
{% endif %}
</ul>
</body>
官方文档
分页¶
Django提供了一些类来帮助你管理分页的数据 -- 也就是说,数据被分在不同页面中,并带有“上一页/下一页”标签。这些类位于django/core/paginator.py
中。
示例¶
向Paginator
提供对象的列表,以及你想为每一页分配的元素数量,它就会为你提供访问每一页上对象的方法:
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
>>> p.count
4
>>> p.num_pages
2
>>> 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()
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
,或者任何带有count()
或__len__()
方法的对象。当计算传入的对象所含对象的数量时,Paginator
会首先尝试调用count()
,接着如果传入的对象没有count()
方法则回退调用 len()
。这样会使类似于Django的QuerySet
的对象使用更加高效的 count()
方法,如果存在的话。
使用 Paginator
这里有一些复杂一点的例子,它们在视图中使用 Paginator
来为查询集分页。我们提供视图以及相关的模板来展示如何展示这些结果。这个例子假设你拥有一个已经导入的Contacts
模型。
视图函数看起来像是这样:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get('page')
try:
contacts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
contacts = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
contacts = paginator.page(paginator.num_pages)
return render_to_response('list.html', {"contacts": contacts})
在list.html
模板中,你会想要包含页面之间的导航,以及来自对象本身的任何有趣的信息:
<div class="pagination">
<span class="step-links">
<span class="current">
Page of .
</span>
</span>
</div>
分页器 objects
Paginator
类拥有以下构造器:
所需参数¶
object_list
A list, tuple, Django
QuerySet
, or other sliceable object with acount()
or__len__()
method.可以是一个列表, 元组, Django的结果集, 或者是任何一个可以迭代的对象
per_page
The maximum number of items to include on a page, not including orphans (see the
orphans
optional argument below).
可选参数¶
orphans
The minimum number of items allowed on the last page, defaults to zero. Use this when you don’t want to have a last page with very few items. If the last page would normally have a number of items less than or equal to
orphans
, then those items will be added to the previous page (which becomes the last page) instead of leaving the items on a page by themselves. For example, with 23 items,per_page=10
, andorphans=3
, there will be two pages; the first page with 10 items and the second (and last) page with 13 items.在最后一页上允许的最小条目数,默认为零。当你不想要一个只有很少的项目的最后一页时,就用这个。如果最后一页通常有一些小于或等于“孤儿”的条目,那么这些条目将被添加到前一页(这是最后一页),而不是自己将条目放在页面上。例如,有23个条目,“perpage=10”和“孤儿=3”,将有两页;第一个页面有10个条目,第二个(和最后一个)页面有13个条目。
allow_empty_first_page
Whether or not the first page is allowed to be empty. If
False
andobject_list
is empty, then anEmptyPage
error will be raised.第一个页面是否被允许为空。如果“False”和“objectlist”是空的,那么就会出现一个“错误”的错误。
方法¶
Paginator.page
(number)[source]¶返回在提供的下标处的
Page
对象,下标以1开始。如果提供的页码不存在,抛出InvalidPage
异常。
属性¶
Paginator.count
¶所有页面的对象总数。注意当计算
object_list
所含对象的数量时,Paginator
会首先尝试调用object_list.count()
。如果object_list
没有count()
方法,Paginator
接着会回退使用len(object_list)
。这样会使类似于Django’sQuerySet
的对象使用更加便捷的count()
方法,如果存在的话。
Paginator.num_pages
¶页面总数。
Paginator.page_range
¶页码的范围,从1开始,例如
[1, 2, 3, 4]
。
InvalidPage exceptions
Paginator.page()
放回在所请求的页面无效(比如不是一个整数)时,或者不包含任何对象时抛出异常。通常,捕获InvalidPage
异常就够了,但是如果你想更加精细一些,可以捕获以下两个异常之一:
这两个异常都是InvalidPage
的子类,所以你可以通过简单的except InvalidPage
来处理它们。
Page objects
你通常不需要手动构建 Page
对象 -- 你可以从Paginator.page()
来获得它们。
class
Page
(object_list, number, paginator)[source]¶当调用
len()
或者直接迭代一个页面的时候,它的行为类似于Page.object_list
的序列。
方法¶
Page.next_page_number
()[source]¶返回下一页的页码。如果下一页不存在,抛出
InvalidPage
异常。
Page.previous_page_number
()[source]¶返回上一页的页码。如果上一页不存在,抛出
InvalidPage
异常。
返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将五个对象的列表分为每页两个对象,第二页的
start_index()
会返回3
。
返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的
end_index()
会返回4
。
属性¶
Page.object_list
¶当前页上所有对象的列表。
Page.number
¶当前页的序号,从1开始。