Django docs显示如何通过捕获EmptyPage
异常,使用基于函数的视图返回分页查询集的最后一页。
使用基于类的通用视图实现相同功能的最简单方法是什么,例如ListView
?
我首先认为MultipleObjectMixin
的{{3}}设置可以满足我的需要,但检查代码表明,如果查询集中没有对象,它只会阻止404错误,而不是零请求页面上的对象。
似乎有两种选择:
ListView
并覆盖paginate_queryset
(继承自MultipleObjectMixin
)或Paginator
并覆盖validate_number
,并将paginator_class
设置为视图中的子类。有没有更好的方法来实现这一目标?
答案 0 :(得分:2)
这是选项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
[...]
这对我来说似乎是最好的选择。
答案 1 :(得分:0)
我知道这很老了,但是我需要它,所以我选择了第一个选项 这是第一个选项的样子:
class MyView(ListView):
.....
.....
def paginate_queryset(self, queryset, page_size):
"""Paginate the queryset, if needed."""
paginator = self.get_paginator(
queryset, page_size, orphans=self.get_paginate_orphans(),
allow_empty_first_page=self.get_allow_empty())
page_kwarg = self.page_kwarg
page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1
try:
page_number = int(page)
except ValueError:
if page == 'last':
page_number = paginator.num_pages
else:
# This was modified to prevent value error related stuff
page_number = 1
try:
page = paginator.page(page_number)
return paginator, page, page.object_list, page.has_other_pages()
except InvalidPage as e:
# this is where you should do the invalid Page error handling
if page_number < 1:
page_number = 1
else:
page_number = paginator.num_pages
page = paginator.page(page_number)
return paginator, page, page.object_list, page.has_other_pages()
TBH,这似乎很冗长,如果有更好的选择,我会予以保证