gpt4 book ai didi

django - 在 get_queryset 中过滤时重置 MultipleObjectMixin 分页

转载 作者:行者123 更新时间:2023-12-04 18:16:26 32 4
gpt4 key购买 nike

我正在使用自定义 mixin 将过滤器应用于使用 MultipleObjectMixin 分页的基于类的 View 的查询集。当我应用过滤器以使当前页面超出数据集范围时,显然会得到 404。我想要做的是捕获此异常并将其重定向到新的最后一页。

我的 get_queryset 有问题的 View :

def get_queryset(self):
filters = self.build_location_filter()
if not filters == None:
return models.Account.corporateAccounts(locations=self.build_location_filter)
else:
return models.Account.corporateAccounts()

有什么建议么?

最佳答案

尝试:

def get(self, request, *args, **kwargs):
try:
return super(MyView, self).get(request, *args, **kwargs)
except Http404:
if kwargs['page'] > self.paginator.num_pages:
return HttpResponseRedirect(reverse('this_view_paged', kwargs={'page': self.paginator.num_pages}))
else:
# re-raise Http404, as the reason for the 404 was not that maximum pages was exceeded
raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
% {'class_name': self.__class__.__name__})

更新

对不起。我真的以为Django添加了 paginator作为实例变量。没有它真的很糟糕,因为它使这比它需要的困难100倍。分页器被隐藏在 paginate_queryset 中,这实际上是 Http404从中提出。这意味着,你甚至不能调用这个方法来获取你的分页器,因为你从中得到的只是一个异常。所以,你必须更深入,不幸的是重复了一些 Django View 逻辑,我讨厌这样做,但这是我能看到的唯一前进道路。由于我们采用了代码重复,无论如何,我现在覆盖整个 paginate_queryset方法。新代码直接从 Django 源代码复制而来,并在注释部分中注明了修改(我为后代保留了上面的原始代码):
def paginate_queryset(self, queryset, page_size):
"""
Paginate the queryset, if needed.
"""
paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty())
page = self.kwargs.get('page') or self.request.GET.get('page') or 1
try:
page_number = int(page)
except ValueError:
if page == 'last':
page_number = paginator.num_pages
else:
raise Http404(_(u"Page is not 'last', nor can it be converted to an int."))
try:
page = paginator.page(page_number)
# Moving this line after the try/except block because DRY
#return (paginator, page, page.object_list, page.has_other_pages())
except InvalidPage:
# This used to raise a 404, but we're replacing this functionality
#raise Http404(_(u'Invalid page (%(page_number)s)') % {
# 'page_number': page_number
#})
page = paginator.page(paginator.num_pages)

return (paginator, page, page.object_list, page.has_other_pages())

关于django - 在 get_queryset 中过滤时重置 MultipleObjectMixin 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569452/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com