Django:如何在基于类的视图中捕获InvalidPage异常?

时间:2012-01-17 14:19:06

标签: django django-views

当页码无效时,Django给我404错误(例如localhost /?page = 9999)。

但我想将它重定向到第一页。在基于函数的视图中,这可以通过捕获InvalidPage异常来完成。

有没有人知道如何在基于类的视图中执行此操作。

提前致谢。

5 个答案:

答案 0 :(得分:1)

之前的答案都没有为我解决问题。也许他们曾经这样做过。这是我使用django 1.3.1的方式:

def get(self, *args, **kwargs):
    request = self.request
    try:
        return super(MyListView, self).get(*args, **kwargs)
    except Http404:
        if request.GET.get('page', 1) == 1:
            raise
    page1 = request.GET.copy()
    del page1['page']
    return redirect('%s?%s' % (request.path, page1.urlencode()))

我进行重定向,因为我不希望人们认为网址有效 - 没有网页N,我们希望正确反映我们将其发送回第1页。

答案 1 :(得分:0)

致电get_context_data并抓住Http404而不是InvalidPage 然后将页面值指定为1,并调用get_context_data

class MyListView(ListView):
    def get_context_data(self, **kwargs):
        try:
            return super(MyListView, self).get_context_data(**kwargs)
        except Http404:
            self.kwargs['page'] = 1
            return super(MyListView, self).get_context_data(**kwargs)

更多信息:

https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L33

https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L84

答案 2 :(得分:0)

只需覆盖get_context_data课程中的ListView方法即可。它在我的项目中运行良好。只需使用@Coc B中的代码。

当然记得将MyListView替换为您的班级名称。

答案 3 :(得分:0)

这对我有用,请覆盖paginate_queryset

class MyListView(ListView):
    def paginate_queryset(self, queryset, page_size):
        try:
            return super(MyListView, self).paginate_queryset(queryset, page_size)
        except Http404:
            self.kwargs['page'] = 1  # return page 1 instead
            return super(MyListView, self).paginate_queryset(queryset, page_size)

答案 4 :(得分:-1)

在您的课程中覆盖get_paginator并在那里执行检查。然后覆盖dispatch以重定向或返回普通视图:

class MyListView(ListView):
    ...
    def get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True):
        paginator = super(MyListView, self).get_paginator(queryset, per_page, orphans=orphans, allow_empty_first_page=allow_empty_first_page)
        try:
            paginator.page(self.kwargs.get('page', 1))
        except EmptyPage: # or InvalidPage, but that's less precise
            self.is_empty = True

        return paginator

    def dispatch(self, request, *args, **kwargs):
        response = super(MyListView, self).dispatch(request, *args, **kwargs)
        if getattr(self, 'is_empty', False):
            return HttpResponseRedirect('/some/other/url/')
        else:
            return response