我们先在 shell 中演示分页器的用法:
# 引入分页器模块
from django.core.paginator import Paginator
objects = ['john', 'paul', 'george', 'ringo']
# 对 objects 对象进行分页,每页2个对象
p = Paginator(objects, 2)
# 对象总数
p.count
>>> 4
# 总页数
p.num_pages
>>> 2
# 获取某页的对象
page1 = p.page(1)
page2 = p.page(2)
page1
>>> <Page 1 of 2>
# 第一页的对象列表
page1.object_list
>>> ['john', 'paul']
# 判断是否存在下一页
page1.has_next()
>>> True
page2.has_next()
>>> False
# 判断是否存在上一页
page2.has_previous()
>>> Trus
page1.has_previous()
>>> Flase
# 判断是否存在其他页
page1.has_other_pages()
>>> True
# 下一页的页码
page1.next_page_number()
>>> 2
# 如果下一页不存在,会报错
page2.next_page_number()
>>> Traceback (most recent call last):
...
raise EmptyPage('That page contains no results')
# 上一页页码
page2.previous_page_number()
>>> 1
# 某页对象索引
page2.start_index() # 第2页第一个对象的索引(从1开始)
>>> 3
page2.end_index() # The 1-based index of the last item on this page
>>> 4
分页器示例
现在我们在 view 中使用分页器:
from django.shortcuts import render
# 分页器,空白页,页面不存在三个模块
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myApp.models import Beatles
def test(request):
context = {}
beatles_list = Beatles.objects.all()
# 分页器,对 beatles_list 进行分页操作,每页显示2个对象
paginator = Paginator(beatles_list, 2)
# get 方法获取页数
page = request.GET.get('page')
try: # 获取某页
beatles_list = paginator.page(page)
except PageNotAnInteger: # 如果 page 参数不为正整数,显示第一页
beatles_list = paginator.page(1)
except EmptyPage: # 如果 page 参数为空页,跳到最后一页
beatles_list = paginator.page(paginator.num_pages)
context['beatles_list'] = beatles_list
return render(request, 'test.html', context)
浏览器打开:http://127.0.0.1:8000/test/?page=1 ,能看到第一页的,再打开:http://127.0.0.1:8000/test/?page=2 ,显示的就是第二页信息。
我们再编辑下前端,做一个上下页的按钮:
<body>
{% for member in beatles_list %}
{{ member }}
<br><br>
{% endfor %}
<br><br>
{# 存在上一页 #}
{% if beatles_list.has_previous %}
<a href="?page={{ beatles_list.previous_page_number}}">上一页</a>
{% endif %}
{# 存在下一页 #}
{% if beatles_list.has_next %}
<a href="?page={{ beatles_list.next_page_number}}">下一页</a>
{% endif %}
</body>
分页器对象
分页器参数
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
object_list: 要进行分页的对象,可以是列表、元组、QuerySet 或其他具有
count()
或__len__()
方法的对象。per_page: 每一页的对象数量
orphans: 页面对象数量不得少于该数量。举个例子,有12个对象,每页显示5个,默认
orphans=0
的时候将会分成3页,第1第2页各有5个对象,第3页2个对象;当设置orphans=2
时候,页面不能少于2个对象,这时对象会被分成2页,第1页有5个对象,第2页有7个对象。allow_empty_first_page: 是否允许第一页为空
分页器属性:
Paginator.count: 所有页面的对象总数。
Paginator.num_pages:页面总数。
Paginator.page_range:页码的范围,返回一个 range 对象,从1开始。
Page 对象
Page 的方法:
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开始。比如,将五个对象的列表分为每页两个对象,第二页的 start_index() 会返回3。
Page.end_index(): 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的 end_index() 会返回 4。
Page属性:
Page.object_list: 当前页上所有对象的列表。
Page.number: 当前页的序号,从1开始。
Page.paginator: 相关的Paginator对象。