知识储备
Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中。
1、Paginator对象
Paginator(列表,int):返回分页对象,参数为列表数据,每一页的条数
count:对象总数
num_pages:页面总数
page_range:页码列表,从1开始,例如[1, 2, 3, 4]
page(num):下标从1开始,如果提供的页码不存在,抛出InvalidPage异常
2、Page对象
Paginator对象的page()方法返回Page对象,不需要手动构造
object_list:当前页上所有对象的列表
number:当前页的序号,从1开始
paginator:当前Page对象相关的Paginator对象
has_next():如果有下一页返回True
has_previous():如果有上一页返回True
has_other_pages():如果有上一页或下一页返回True
next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
len():返回当前页面对象的个数
一、基于函数视图的分页
1、View
from django.core.paginator import Paginator
# 查询英雄
def hero(request, page_now):
if page_now == "":
page_now = 1
# 每一页的条数
page_size = 2
hero_list = HeroInfo.objects.all()
# 创建Paginator对象
my_paginator = Paginator(hero_list, 2)
# 创建Page对象
my_page = my_paginator.page(page_now)
# 渲染模板,返回响应
return render(request, "hero.html", {"hero_list": hero_list, "my_page": my_page})
2、Template
<ul>
{% for hero in my_page.object_list %}
<li>
{{ hero.hname }}
<a href="/myhero/hero_delete/{{ hero.id }}">删除</a>
<a href="/myhero/hero_edit/{{ hero.id }}">编辑</a>
</li>
{% endfor %}
</ul>
{% if my_page.has_previous %}
<a href="/myhero/hero/{{ my_page.previous_page_number }}">上一页</a>
{% endif %}
{% for i in my_page.paginator.page_range %}
{% if my_page.number == i %}
<span>{{ i }}</span>
{% else %}
<a href="/myhero/hero/{{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
{% if my_page.has_next %}
<a href="/myhero/hero/{{ my_page.next_page_number }}">下一页</a>
{% endif %}
二、基于类视图的分页
1、View
class HeroListView(ListView):
queryset = HeroInfo.objects.all()
context_object_name = 'hero_list'
template_name = 'hero.html'
# 分页,默认使用page_obj对象
paginate_by = 2
2、Template
<ul>
{% for hero in hero_list %}
<li>
{{ hero.hname }}
<a href="/myhero/hero_delete/{{ hero.id }}">删除</a>
<a href="/myhero/hero_edit/{{ hero.id }}">编辑</a>
</li>
{% endfor %}
</ul>
{% if page_obj.has_previous %}
<a href="/myhero/hero_list?page={{ page_obj.previous_page_number }}">上一页</a>
{% endif %}
{% for i in page_obj.paginator.page_range %}
{% if page_obj.number == i %}
<span>{{ i }}</span>
{% else %}
<a href="/myhero/hero_list?page={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a href="/myhero/hero_list?page={{ page_obj.next_page_number }}">下一页</a>
{% endif %}
网友评论