详解Django的 paginate_by() 函数:指定每页显示的数量

  • Post category:Python

Django中的 paginate_by() 函数是用于分页的函数。通过该函数,我们可以将数据库查询集或一个列表分割成指定数量的对象列表,并将其展示在页面上,从而实现对于大量数据的分页浏览。

函数作用

paginate_by() 函数可以将查询集分隔,并将其分成文档页面。 每个单独的页面将只包括某个数量的元素,然后通过提供的HTML模板展示。

函数使用方法

该函数使用非常简单,只需要在ListView视图中的create()函数中编写代码即可。

from django.views.generic.list import ListView
from myapp.models import Post

class PostList(ListView):
    model = Post
    template_name = 'post_list.html'
    context_object_name = 'posts'
    paginate_by = 10

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['page_title'] = 'My Blog'
        return context

以上代码中,paginate_by = 10 指定了一页页面应具有的帖子数量,也就是说,每页应该显示最多10个对象。 在这个例子中,我们在 get_context_data() 方法中定义了一些额外的上下文数据,如所请求页面的标题。

除了 paginate_by 之外,还有一些与分页控制相关的其他选项:

  • paginate_orphans:指定在其他选项无法获得足够查询集时,保留在页面底部的剩余对象数。例如,在3个对象/页设置下,如果我们的查询集只有4个对象,则paginage_orphans选项将决定我们是否保留一个孤立的小部分页面而不是取消页面并将所有项目都都加入前三个页面中。

  • page_kwarg:指定从 URL 中获取页数的参数名称,如果没有,则为 page

  • allow_empty_first_page: 允许在页面上第一页上使用极少的查询项。

使用示例

示例1

假如我们有一个非常大的电影列表,需要将它们分成数个页面,并按照发行日期将它们显示出来。在这个场景下,我们可以使用 paginate_by 函数使其适应页面分页控制。

from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.shortcuts import render
from .models import Movie

def movie_list(request):
    movie_list = Movie.objects.order_by('-release_date')

    paginator = Paginator(movie_list, 25)  # 每页展示25个电影
    page = request.GET.get('page')

    try:
        movies = paginator.page(page)
    except PageNotAnInteger:
        movies = paginator.page(1)
    except EmptyPage:
        movies = paginator.page(paginator.num_pages)

    return render(request, 'movie_list.html', {'movies': movies})

以上代码中,paginator = Paginator(movie_list, 25) 表示分页为每页25部电影。我们通过 request.GET.get('page') 获取URL中的页码信息,最终将分页结果展示在 movie_list.html 模板中。

示例2

假如我们有一个博客列表,需要将其按照发布时间排序并将其分页,如果在页面底部对象剩余的数量少于5个,则保留它们进行显示。

from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import Blog

def blog_list(request):
    blog_list = Blog.objects.order_by('-publish_date')
    paginator = Paginator(blog_list, 10, orphans=5)  # 每页10篇文章
    page = request.GET.get('page')

    try:
        blogs = paginator.page(page)
    except PageNotAnInteger:
        # 如果 page 参数不是一个数字,把它设置为第一页
        blogs = paginator.page(1)
    except EmptyPage:
        # 如果 page 参数超出实际上存在的范围,只返回最后一页
        blogs = paginator.page(paginator.num_pages)

    return render(request, 'blog_list.html', {'blogs': blogs})

以上代码中,paginator = Paginator(blog_list, 10, orphans=5) 表示分页为每页10篇博客,如果在页面底部剩余的对象数量小于5,则保留它们进行显示。最终将分页结果展示在 blog_list.html 模板中。

以上是 paginate_by() 函数的作用与使用方法,希望对您有所帮助。