web-dev-qa-db-ja.com

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)
28
e-satis

それを見つけた:

def render_to_response(self, context):

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

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

これはすべてのHTTPメソッドに対して呼び出されます

10
e-satis

これは古いことは知っていますが、実際にはTommasoに同意します。 dispatch()メソッドは、要求を処理し、HTTP応答を返すものです。ビューの応答を調整したい場合は、それを行う場所です。これが docs on dispatch()です。

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
28
Jonathan