数据多了在一页全部显示不仅不美观,也给服务器带来很大压力。django提供了分页的工具,那就是paginator类,下面来看看该怎么用:
首先要导入该类:
from django.core.paginator import Paginator
认识Paginator类
class Paginator(object_list, per_page,orphans=0,allow_empty_first_page = True)
必需参数:
其中object_list可以是列表,元组,Django 查询集,或者其他有count()和__len__()方法的可切分对象
per_page指每页显示的最大数量
可选参数
orphans最后一页允许显示的最小数量,默认值为0,主要作用是防止最后一页显示的数量太少,
若数量小于orphans规定的值,则在前一页显示。
allow_empty_first_page是否允许第一页是空的
方法:
Paginator.page(number) 返回指定页的对象
属性:
Paginator.count 所有对象的数量
Paginator.num_pages 分页后的总页数
Paginator.page_range 从1开始的页码的区间如[1,2,3,4]
通过Paginator.page(number)可以获取Page对象
Page对象一般不手动生成
方法
Page.has_next() 返回True如果还有下一页
Page.has_previous() 返回True如果还有上一页
Page.has_other_pages()返回True如果还有上一页或下一页
Page.next_page_number()返回下一页的页码,有风险,即使不存在也会返回
Page.previous_page_number()返回前一页的页码,有风险,即使不存在也会返回
Page.start_index()返回当前页的第一个对象
Page.end_index()返回当前页的最后一个对象
属性
Page.object_list 一页中包含的项目的列表
Page.number 一页中包含的项目数量
Page.paginator 对应的Paginator对象
基础知识学完了以后来看个例子:
在视图中使用Paginator
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def listing(request):
contact_list = Contacts.objects.all()
p = Paginator(contact_list , 25)
page = request.GET.get('page')
try:
contacts = paginator.page(page)
except PageNotAnInteger:
# 如果页码不是整数,返回第一页.
contacts = paginator.page(1)
except EmptyPage:
# 如果页码不在范围内,返回最后一页
contacts = paginator.page(paginator.num_pages)
return render_to_response('list.html', {"contacts": contacts})
再看看与此对应的模版该怎么写:
{% 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={{ 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>