本文共 5308 字,大约阅读时间需要 17 分钟。
Django分页参考官方文档:
现在我的分页和forloop产生冲突,forloop.counter第一页显示正常,第二页还是从1开始计数,初步判定是DWZ框架的问题。问题如下图所示:
Django 1.0 中分页机制和先前已经大不相同。它提供了一些类协助你把数据分页。 对应的文件为 django/core/paginator.py
举例¶
类Paginator,带两个构造参数,一个就是数据的集合,另一个表示每页放几个数据。
>>> from django.core.paginator imp
>>> 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()
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
>>> 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 imp
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})
在模板文件
{% 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)
必传参数¶
可选参数¶
方法¶
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``可用:
上述两个都是 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相关的分页类我的心得:
1. 第一步
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
得到一个Paginator对象。通过其构造方法实现
第二步:通过这个对象来得到一个Page对象出来。因为
Page的对象有如下的方法及属性
Page.has_next() 分页用
当前页的数据集为:
Page.object_list 当前数据集!我们就是去读取这个数据集中的内容出来!
来自己写一个测试页面试下
包含import相关类from django.core.paginator import Paginator, InvalidPage, EmptyPage。
接着,设置分页属性,paginator=Paginator(数据列表, 每页数据量)。
于是就可以获得各种相关的属性:
总页数:paginator.num_pages
总记录数: paginator.count
页的范围: paginator.page_range, 比如 [1, 2, 3, 4]
页数据(list): page.object_list
当前页码: page.number、
以及相关的方法:
是否有下页:page.has_next(), True/False
是否有上页:page.has_previous()
下一页的页码:page.next_page_number()
上一页的页码:page.previous_page_number()
当前页第一个对象: page.start_index()
当前页最后一个对象: page.end_index()
我所使用的view.py中的代码:
paginator = Paginator(ret, 1)
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
contacts = paginator.page(page)
except (EmptyPage, InvalidPage):
contacts = paginator.page(paginator.num_pages)
模板中的相关代码:
<div class="pagination">
<span class="step-links">
{% if rets.has_previous %}
<a href="?searchtext={
{ search_value }}&page={ { rets.previous_page_number }}"><前页</a><a href="?searchtext={
{ search_value }}&page={ { rets.previous_page_number }}"> { {rets.previous_page_number}} </a>{% endif %}
<span class="current">
{
{ rets.number }}</span>
{% if rets.has_next %}
<a href="?searchtext={
{ search_value }}&page={ { rets.next_page_number }}"> { {rets.next_page_number}} </a><a href="?searchtext={
{ search_value }}&page={ { rets.next_page_number }}">后页></a>{% endif %}
<span class="count">
(共{
{rets.paginator.num_pages}}页)</span>
</span>
</div>
转载地址:http://gzxci.baihongyu.com/