Django: Как перехватить исключение InvalidPage в представлениях на основе классов? - PullRequest
2 голосов
/ 17 января 2012

Django выдает ошибку 404, когда номер страницы недействителен (например, localhost /? Page = 9999).

Но я хочу перенаправить его на первую страницу. В функциональных представлениях это можно сделать, перехватив исключение InvalidPage.

Кто-нибудь знает, как это сделать в представлениях на основе классов.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 23 января 2013

Ни один из предыдущих ответов не решил проблему для меня.Может быть, они сделали в одно время.Вот как я использовал 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()))

Я делаю перенаправление, потому что не хочу, чтобы люди думали, что URL-адрес действителен - страницы N нет, и мы хотим правильно отразитьчто мы отправляем их обратно на страницу 1.

0 голосов
/ 07 января 2016

Просто переопределите get_context_data метод в вашем ListView классе. Это прекрасно работает в моем проекте. Просто используйте код из @Coc B.

Конечно, не забудьте заменить MyListView на имя вашего класса.

0 голосов
/ 25 марта 2012

Позвоните 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

0 голосов
/ 17 января 2012

Переопределите 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
...