Как перенаправить условия с представлениями на основе классов в Django 1.3?

Я использую ListView, в котором перечислены видео в соответствии с тегами. Фильтрация происходит в get_queryset(). Я хочу перенаправить пользователя на другую страницу, если тег не содержит видео.

С функцией было бы проще. Запрос, проверка набора запросов, перенаправление. С классом я не могу этого сделать:

class VideosView(generic.ListView):

    def get_queryset(self):
        """
            This work.
        """

        tag = self.kwargs.get('tag', None)

        self.videos = Video.on_site.all()

        if tag:
            self.videos = Video.tagged.with_all(tag, self.videos)

        return self.videos

    def get(self, request, *args, **kwargs):
        """
        This doesn't work because self.videos doesn't exist yet.
        """
        if not self.videos:
            return redirect('other_page')

        return super(Videos, self).get(request, *args, **kwargs)

person e-satis    schedule 25.03.2011    source источник


Ответы (3)


Я знаю, что это старо, но я действительно согласен с Томмазо. Метод dispatch() обрабатывает запрос и возвращает HTTP-ответ. Если вы хотите настроить реакцию представления, это то место, где это можно сделать. Вот docs при отправке().

class VideosView(ListView):
    # use model manager
    queryset = Videos.on_site.all()

    def dispatch(self, request, *args, **kwargs):
        # check if there is some video onsite
        if not queryset:
            return redirect('other_page')
        else:
            return super(VideosView, self).dispatch(request, *args, **kwargs)

    # other method overrides here
person Jonathan    schedule 18.08.2012
comment
Если набор запросов динамический, как его получить? - person e-satis; 03.02.2013
comment
У вас все еще должен быть доступный вам объект набора запросов. У вас есть пример? - person Jonathan; 13.02.2013
comment
Если я хорошо помню, ListView генерирует динамический набор запросов в get_queryset, а затем разбивает на страницы в get_context. Использование отправки, кажется, вызывает их, это не круто, если вы хотите перенаправить в соответствии с этим. - person e-satis; 13.02.2013
comment
Как это некруто? Отправка — это место, где обрабатывается запрос и возвращается ответ. Мне кажется, что если вы хотите иметь дело с условными выражениями перенаправления, это будет именно то место, где они вам понадобятся. - person Jonathan; 13.02.2013
comment
Как получить доступ к набору запросов, чтобы проверить условие, если оно вызывается при отправке? - person e-satis; 13.02.2013
comment
Вы можете получить доступ к методу, вызвав self.get_queryset(), а затем запустив для него условие. - person Jonathan; 13.02.2013
comment
Во-первых, он будет вызван во второй раз с помощью dispatch(), во-вторых, вы не получите версию с разбивкой на страницы. - person e-satis; 13.02.2013
comment
Вопрос был о том, где разместить логику перенаправления. Вы правы, логика с разбивкой на страницы не будет вызываться, но если вы перенаправляете, вам не понадобится версия вашего набора запросов с разбивкой на страницы. - person Jonathan; 14.02.2013
comment
Но вам нужна логика разбиения на страницы для перенаправления на основе набора запросов. Как узнать содержимое текущего набора запросов с разбивкой на страницы? В вашем случае у вас будет только весь набор запросов. Это совсем не то же самое. - person e-satis; 14.02.2013
comment
@e-satis У меня была точно такая же проблема, render_to_response не может быть лучшего места для этого. Теоретически dispatch обрабатывает перенаправления, но когда все расчеты должны быть выполнены до перенаправления, render_to_response — это место. - person raratiru; 29.01.2018

Нашел это:

def render_to_response(self, context):

    if not self.videos:
        return redirect('other_page')

    return super(VideosView, self).render_to_response(context)

Это вызывается для всех методов HTTP

person e-satis    schedule 25.03.2011
comment
Я согласен с решением, но не кажется ли вам, что метод отправки представления является более подходящим? - person Tommaso Barbugli; 25.03.2011
comment
Что ж, диспетчеризация будет вызывать методы get или post, которые вызывают набор запросов, которые получают список видео, поэтому для меня это не так естественно. Почему вы думаете, что будет лучше? - person e-satis; 30.03.2011
comment
Вот документы django 1.3 по перенаправлению - person Sethish; 28.03.2013
comment
Ответ принесет пользу для немного большего контекста. Я предполагаю, что есть базовая функция get_queryset и нет функции обработчика HTTP-метода get/post get_query_set. Как правило, вы не хотели бы делать много «работы», а затем просто делать перенаправление в самом конце запроса. Если бы необходимость перенаправления могла быть определена до/без доступа к набору запросов, тогда метод Dispatch был бы лучшим местом. - person Dwight Gunning; 21.04.2015