Django自身提供了一些类来实现管理分页,数据被分在不同的页面中,并带有“上一页/下一页”标签。这个类叫做Pagination,其定义位于 django/core/paginator.py 中。
实例:简单分页
- views
def index(request):
users = User.objects.all()
pindex = request.GET.get("pindex")
#分页
pageinator = Paginator(users, 2)
if pindex=="" or pindex==None:
pindex = 1
page = pageinator.page(pindex)
return render(request,'page_demo/index.html',{'page':page})
- templates
遍历:
{% for emp in page.object_list %}
{% endfor %}
分页:
{% if page.has_previous %}
<a href="/emp/empList/?pindex={{ page.previous_page_number }}"><上一页</a>
{% endif %}
{% for pindex in page.paginator.page_range %}
{% if pindex == page.number %}
{{ pindex }}
{% else %}
<a href="/emp/empList/?pindex={{ pindex }}">{{ pindex }}</a>
{% endif %}
{% endfor %}
{% if page.has_next %}
<a href="/emp/empList/?pindex={{ page.next_page_number }}">>下一页</a>
{% endif %}
- 配置urls映射,完成分页
知识点:
- pagtor = Paginator(User.objects.all(),per_page=3) # 构造分页器对象
- Paginator.count:所有页面对象总数,即统计object_list中item数目。
- Pagnator.num_pages:页面总数。
- pagiator.page_range:页面范围,从1开始,例如[1,2,3,4]
- page = Paginator(User.objects.all(),per_page=3).page(1) # 获取第一页
- Page.has_next () 如果有下一页,则返回 True
- Page.has_previous () 如果有上一页,返回 True
- Page.has_other_pages () 如果有上一页或下一页,返回 True
- Page.next_page_number () 返回下一页的页码。如果下一页不存在,抛出 InvlidPage 异常
- Page.previous_page_number () 返回上一页的页码。如果上一页不存在,抛出InvalidPage异常
- Page.start_index () 返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将
五个对象的列表分为每页两个对象,第二页的 start_index() 会返回 3 - Page.end_index () 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,
将五个对象的列表分为每页两个对象,第二页的 end_index() 会返回 4 - Page.object_list 当前页上所有对象的列表
- Page.number 当前页的序号,从1开始
- Page.paginator 相关的 Paginator 对象