Django的get_paginator()函数是用于分页的方法。它可以根据指定的每页数据量和总数据量,返回一个Paginator对象,该对象可以用于在模板中轻松地渲染分页导航条和分页列表数据。
使用方法:
1.导入相应模块,即django.core.paginator:
from django.core.paginator import Paginator
2.创建Paginator对象,指定每页显示的数据量和数据集:
paginator = Paginator(data_list, per_page)
data_list是需要分页的数据 list,per_page是每页显示的数据量。Paginator能够自动计算得出总页数。
3.获取指定页面的数据:
page_obj = paginator.get_page(page_number)
page_number是需要获取的页面号。如果该页不存在则引发PageNotAnInteger或EmptyPage异常,可以通过try…except捕获异常,返回默认数据:获取第一页。
4.在模板中使用Paginator对象渲染分页导航和分页数据。
示例1:获取指定页面的数据
假设需要在一个博客列表页面中,每页显示5篇博客的摘要,并提供分页导航条。可以这样处理:
from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from myapp.models import Blog
def blog_list(request):
# 获取所有的博客
blog_list = Blog.objects.all()
# 创建分页器,并指定每页显示5篇博客
paginator = Paginator(blog_list, 5)
# 获取请求的页码,默认为1
page_number = request.GET.get('page', 1)
# 获取指定页码的博客列表
page_obj = paginator.get_page(page_number)
# 渲染模板,传递上下文
return render(request, 'blog_list.html', {'page_obj': page_obj})
在模板中,可以像这样渲染分页导航条和分页博客列表:
<div class="pagination">
{% if page_obj.has_previous %}
<a href="?page={{page_obj.previous_page_number}}">«</a>
{% endif %}
{% for i in page_obj.paginator.page_range %}
{% if page_obj.number == i %}
<strong>{{ i }}</strong>
{% else %}
<a href="?page={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a href="?page={{page_obj.next_page_number}}">»</a>
{% endif %}
</div>
{% for blog in page_obj %}
<h2>{{ blog.title }}</h2>
<p>{{ blog.summary }}</p>
{% endfor %}
示例2:处理非整数页码请求
如果用户在地址栏中输入的页码是小数或字符串,Django将引发PageNotAnInteger异常。可以添加try…except捕获这个异常,并返回默认页码,例如第一页。例如:
# 获取请求的页码,默认为1
page_number = request.GET.get('page', 1)
# 尝试将页码转换为整数
try:
page_number = int(page_number)
except ValueError:
page_number = 1
# 获取指定页码的博客列表
page_obj = paginator.get_page(page_number)
这样,无论用户输入的是多少,都能正确渲染出数据。
总结:
get_paginator()可以方便地实现Django网站的分页。你只需要在视图函数中准备好数据集和每页数据量,就可以调用 get_paginator() 获取Paginator对象,并在模板中使用Paginator对象渲染分页导航和分页数据,从而实现分页显示。