タグに従ってビデオを一覧表示する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)
それを見つけた:
def render_to_response(self, context):
if not self.videos:
return redirect('other_page')
return super(VideosView, self).render_to_response(context)
これはすべてのHTTPメソッドに対して呼び出されます
これは古いことは知っていますが、実際には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