详解Django的 paginate_orphans() 函数:指定一页最少显示的对象数量

yizhihongxing

Django的paginate_orphans()函数详解

paginate_orphans()函数是Django框架中pagination(分页)模块的一部分。其作用是用来确定在一个分页显示中的一页中最少要显示的记录数量。当一页中只有“孤儿”记录时,可以将它们作为上一页的最后一页来显示,以免摆在一页中的孤儿记录过少而显得过于孤立。

使用方法:

class CustomPaginator(Paginator):
    def __init__(self, orphans=0, *args, **kwargs):
        self.orphans = orphans
        super(CustomPaginator, self).__init__(*args, **kwargs)

    def _get_page(self, *args, **kwargs):
        page_number = kwargs.pop('page_number', 1)
        if page_number in self._pages:
            return self._pages[page_number]
        if page_number > self.num_pages:
            if hasattr(self.object_list, 'count') and \
                    self.object_list.count() > 0:
                raise EmptyPage(_('That page contains no results'))
            else:
                raise EmptyPage(_('That page contains no results'))
        bottom = (page_number - 1) * self.per_page
        top = bottom + self.per_page + self.orphans - 1
        if top >= self.count:
            top = self.count - 1
        self._check_object_list_is_ordered()
        page = self._get_page_from_object_list(self.object_list[bottom:top + 1], *args, **kwargs)
        if self.orphans and self.count - top - 1 < self.orphans and \
                page.has_previous():
            top = self.count - self.orphans - self.per_page - 1
            bottom = top - self.per_page + 1
            page = self._get_page_from_object_list(self.object_list[bottom:top + 1], *args, **kwargs)
        self._pages[page_number] = page
        return page

其中orphans参数默认为0,代表每一页都至少需要显示一定数量的数据,也就是不被视为“孤儿记录”的数据量。如果某一页显示的数据量少于设定的orphans值,那么这些“孤儿记录”会在分页显示中被自动分配到上一页的最后一页,以保持页面显示的整洁性。

接下来给出两个实例来说明该函数的作用与使用方法:

实例一

假设我们的业务需求是在一个友链页面上展示多个友情链接,每页只展示3个链接信息,需要保证每一页至少展示2个链接信息。

使用上述的CustomPaginator类及paginate_orphans设置为2进行友链列表数据的分页:

from django.core.paginator import EmptyPage, Paginator
from django.views.generic import ListView
class FriendLinkView(ListView): 
    template_name = 'friend_link.html'
    model = FriendLink
    paginate_by = 3

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        orphans = 2  # 每一页需要至少有 2 个记录
        paginator = CustomPaginator(orphans=orphans, object_list=self.get_queryset(), per_page=self.paginate_by)
        page = self.request.GET.get('page')

        try:
            friend_link_list = paginator.page(page)
        except EmptyPage:
            friend_link_list = paginator.page(paginator.num_pages)

        context['friend_link_list'] = friend_link_list
        return context

当FriendLink表中的记录有4条时,需要分两页展示,则实现效果如下图所示:

friend_link

可以看到第一页有3个友链信息,第二页只有1个友链信息,但由于设定的orchans值为2,所以第一页只有2个链接的显示,第3个友链信息自动分配到第二页上,保证了页面显示的整洁性。

实例二

使用paginate_orphans()函数可以方便地设置分页显示的规则,可以根据具体的需求来设置。

例如,我们有一个博客网站,需要在分类页面上分页展示博文列表,每一页最多只能显示10篇文章,但需要保证每一页至少会展示出两篇文章。那么我们可以使用:

from django.core.paginator import EmptyPage, Paginator
from django.views.generic import ListView

class BlogListView(ListView):
    template_name = 'blog_list.html'
    model = Blog
    paginate_by = 10

    def get_context_data(self, **kwargs):
        context = super(BlogListView, self).get_context_data(**kwargs)
        orphans = 2  # 每一页需要至少有 2 篇文章
        blog_list = self.get_queryset()
        paginator = Paginator(blog_list, self.paginate_by, orphans=orphans)
        page = self.request.GET.get('page')
        try:
            blogs = paginator.page(page)
        except EmptyPage:
            blogs = paginator.page(paginator.num_pages)
        context['blogs'] = blogs
        return context

这个例子与实例一相似,只需要改变model类和template_name即可。下图是展示效果:

blog_list

可以看到,第一页只展示了8篇文章,第二页展示了7篇文章,但是由于它们少于设置中的“至少有两篇文章”,系统自动将它们视为孤儿,将这些文章挤到了上一页中展示,保证了整个分页的整洁性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Django的 paginate_orphans() 函数:指定一页最少显示的对象数量 - Python技术站

(0)
上一篇 2023年3月23日
下一篇 2023年3月23日

相关文章

  • 详解Django的 select_related() 函数:对关联对象进行选择

    Django select_related()函数 select_related()函数是Django中用于 优化查询性能 的一个重要函数。 使用select_related()可以使查询数据时,Django在所有涉及到联合查询的外键开始处进行一次性的联合查询,从而减少了多次访问数据库的必要性。 当一个查询涉及多个表时,使用select_related()可…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_absolute_url() 函数:返回模型对象的 URL

    Django中的get_absolute_url()函数是一个作用于models.Model类的方法,它的作用是返回一个对象的URL,以便进行自动生成的链接,该函数可以被Django内置视图和其他第三方库使用。 使用方法 1. 在models.Model中定义get_absolute_url() 在models.py文件中,可以为每个必须展示在用户面前的模型…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 annotate() 函数:对查询结果进行聚合

    下面是Django的annotate()函数的作用与使用方法的完整攻略: 1. annotate()函数的作用 annotate()函数是Django的Model API中的一个高级查询函数,它的作用是对查询结果进行注解、统计和计算,并将这些结果添加到查询结果的每个对象中。可以理解为给查询结果增加一个字段,这个字段的值是统计、注解和计算后的结果。 2. an…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 post() 函数:处理 POST 请求

    Django中的post()函数 作用 在Django框架中,post()函数是在HTTP POST请求中使用的一个方法。当用户在表单中提交数据时,post()函数用于处理表单数据。 使用方法 在视图文件中使用post()函数,需要先引入它,示例代码如下: from django.views.decorators.csrf import csrf_exemp…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 page_range() 函数:获取页码范围

    首先,page_range()函数是Django自带分页器Paginator中的一个方法。它的主要作用是返回当前页左右两侧的页码范围。 使用方法如下: from django.core.paginator import Paginator items = [‘item1’, ‘item2’, ‘item3’, ‘item4’, ‘item5’, ‘item6…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_form() 函数:获取视图所使用的表单实例

    下面是关于 Django 的 get_form() 函数的详细讲解。 1. get_form() 函数的作用 get_form() 是 Django 中一个非常重要的函数,其作用是返回一个表单实例,在视图函数中常常用于修改或者添加数据时,使用不同类型的表单进行数据的处理。 2. get_form() 函数的使用方法 通常情况下,get_form() 函数需要…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_initial() 函数:获取表单的初始值

    Django的get_initial()函数是一个视图类中的一个方法,它用于返回视图中表单的初始值。在表单渲染前调用此方法,可以在渲染表单时指定初始值。下面我们来详细讲解一下该函数的使用方法和注意点。 使用场景 表单的默认值:你的表单希望在打开时显示预设和默认值。 动态的表单默认值:表单的默认值基于前一个表单步骤中填写的数据。 多表单向导流程设计:当您有多个…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 form_invalid() 函数:当表单验证失败时执行的操作

    下面就 Dajngo 的 form_invalid() 函数进行详细讲解。 form_invalid() 函数作用 form_invalid() 是 Django 中 FormMixin 类提供的一个方法,用于提交表单时数据不合法情况下的处理。当表单提交后,如果数据不合法,在 form_invalid() 中我们可以对数据进行重新处理或提示用户输入错误。通常…

    Django函数大全 2023年3月23日
    00
合作推广
合作推广
分享本页
返回顶部