ブログアプリケーションでDjangoのクラスベースのジェネリックビューを使用しています。ビューの1つに、特定のタグが付いた投稿のリストが表示されます。このビューは、ListView
タグでフィルタリングされた投稿として記述できます。または、このビューをDetailView
タグのとして記述し、関連する投稿をコンテキストに追加することもできます。
一方の方法はもう一方の方法よりも適切ですか(またはPythonic)?
私が欲しいのは投稿のリストであるため、このListView
アプローチはよりセマンティックに見えますが、少し複雑でもあります。2つのメソッドを上書きする必要があります。このアプローチでは、1つのメソッドを上書きするだけで済みます。DetailView
class PostTagView(ListView):
"""Display all blog posts with a given tag."""
queryset = Post.objects.published()
def get_context_data(self, **kwargs):
context = super(PostTagView, self).get_context_data(**kwargs)
context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug'])
return context
def get_queryset(self, **kwargs):
queryset = super(PostTagView, self).get_queryset()
return queryset.filter(tags__slug=self.kwargs['slug'])
class TagDetailView(DetailView):
"""Display all blog posts with a given tag."""
model = Tag
def get_context_data(self, **kwargs):
context = super(TagDetailView, self).get_context_data(**kwargs)
context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug'])
return context