使用 ListView 显示分页结果的最后一页而不是 404

Tim*_*imB 3 django django-views

Django文档展示了如何通过捕获EmptyPage异常使用基于函数的视图返回分页查询集的最后一页。

例如,使用基于类的通用视图实现相同目标的最简单方法是什么ListView

我首先认为allow_emptyfor的设置MultipleObjectMixin可以满足我的需要,但检查代码表明,如果查询集中的对象为零,而不是请求的页面上的对象为零,它只会防止 404 错误。

两个选项似乎是:

  1. 子类ListView和覆盖paginate_queryset(继承自MultipleObjectMixin),或
  2. subclassPaginator和 override validate_number,并paginator_class在视图中设置为子类。

有没有更好的方法来实现这一目标?

Tim*_*imB 6

下面是选项 2 的样子:

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

class SafePaginator(Paginator):
    def validate_number(self, number):
        try:
            return super(SafePaginator, self).validate_number(number)
        except EmptyPage:
            if number > 1:
                return self.num_pages
            else:
                raise

class MyView(ListView):
    paginator_class = SafePaginator
    paginate_by = 25

    [...]
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是目前最好的选择。