详解Django的 get_paginator() 函数:获取分页器

  • Post category:Python

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}}">&laquo;</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}}">&raquo;</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对象渲染分页导航和分页数据,从而实现分页显示。