本文共 2807 字,大约阅读时间需要 9 分钟。
Django提供了一些类来帮助你管理分页的数据 -- 也就是说,数据被分在不同页面中,并带有“上一页/下一页”标签。这些类位于django/core/paginator.py中。
向提供对象的列表,以及你想为每一页分配的元素数量,它就会为你提供访问每一页上对象的方法:
>>> from django.core.paginator import Paginator>>> objects = ['john', 'paul', 'george', 'ringo']>>> p = Paginator(objects, 2)>>> p.count4>>> p.num_pages2>>> p.page_range[1, 2]>>> page1 = p.page(1)>>> page1>>> 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 page3>>> page2.end_index() # The 1-based index of the last item on this page4>>> 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()方法,如果存在的话。
这里有一些复杂一点的例子,它们在视图中使用 来为查询集分页。我们提供视图以及相关的模板来展示如何展示这些结果。这个例子假设你拥有一个已经导入的Contacts模型。
视图函数看起来像是这样:
from django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerdef 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 模板中,你会想要包含页面之间的导航,以及来自对象本身的任何有趣的信息:
Page of .
所有页面的对象总数。
注意
当计算object_list所含对象的数量时, Paginator会首先尝试调用object_list.count()。如果object_list没有 count() 方法,Paginator 接着会回退使用len(object_list)。这样会使类似于Django’s QuerySet的对象使用更加便捷的count()方法,如果存在的话。
页面总数。
页码的范围,从1开始,例如[1, 2, 3, 4]。
如果有下一页,则返回True。
如果有上一页,返回 True。
如果有上一页或下一页,返回True。
返回下一页的页码。如果下一页不存在,抛出异常。
返回上一页的页码。如果上一页不存在,抛出异常。
返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将五个对象的列表分为每页两个对象,第二页的会返回3。
返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的 会返回 4。
当前页上所有对象的列表。
当前页的序号,从1开始。
相关的对象。
转载地址:http://vdxgi.baihongyu.com/