Django 使用 Paginator 进行分页
# 导入 Paginator类
from django.core.paginator import Paginator
# 构建一个测试列表
test_list = [i for i in range(0,10)]
# 创建一个分页器,每页 4 条数据
p = Paginator(test_list, 4)
# 查看共有多少条数据
p.count # 10
# 查看共有多少页,总共 1~3, 3 页,range 不包含最后一个
p.page_range # range(1, 4)
# ------------- 第一页
# 获取第一页数据
page1 = p.page(1)
# 打印当前属于第几页
print(page1) # <Page 1 of 4>
# 查看当前页的对象,以列表形式返回
page1.object_list # [0, 1, 2]
# 使用 for 打印当前页的内容
for i in page1:
print(i)
# ------------- 第二页
page2 = p.page(2)
# 查看是否有上一页
page2.has_previous() # True
# 上一页是第几页
page2.previous_page_number() # 1
# 查看是否有下一页
page2.has_next() # True
# 下一页是第几页
page2.next_page_number() # 3
# 当前页开始的数据
page2.start_index() # 5
# 当前页结束的数据
page2.end_index() # 8
# ------------- 第三页
page3 = p.page(3)
# 查看是否有下一页
page3.has_next() # False
# 查看是否有上一页
page3.has_previous() # True
# 上一页是第几页
page3.previous_page_number() # 2
# 是否有其他页
page3.has_other_pages() # True
写一个分页的后端逻辑,前提:当前已有一个数据库,数据库中有 5 条客户数据,现要求每页显示 2 条。
def guest_manage_with_pages(request):
# 获取所有数据
guest_list = Guest.objects.all()
# 创建一个分页器,每页显示 2 条数据
paginator = Paginator(guest_list, 2)
# 接收前端传来的 page,后端进行翻页
page = request.GET.get('page')
# 获取指定页数据
try:
contacts = paginator.page(page)
# 参数错误返回第一页数据
except PageNotAnInteger:
contacts = paginator.page(1)
# 超过最大页数返回最后一页
except EmptyPage:
contacts = paginator.page(paginator.num_pages)
# 传递给前端
return render(request, 'guest_manage.html', {'user':username,'guests':contacts})
前端显示逻辑
<div class="pagination">
<span class="step-links">
<!-- 如果有上一页,显示上一页的 a 链接 -->
{% if guests.has_previous %}
<a href="?page={{ guests.previous_page_number }}">上一页</a>
{% endif %}
<!-- 打印当前属于第几页 -->
<span class="current">
<!-- Page {{ guests.number }} of {{ guests.paginator.num_pages }} -->
{{ guests }}
</span>
<!-- 如果有下一页,显示下一页的 a 链接 -->
{% if guests.has_next %}
<a href="?page={{ guests.next_page_number }}">下一页</a>
{% endif %}
</span>
</div>
最终效果:
第一页:
第二页:
第三页: