我在博客应用程序中使用 Django 的基于类的通用 View 。我的一个 View 显示具有特定标签的帖子列表。我可以将此 View 编写为帖子的 ListView
,按标签过滤。或者我可以将此 View 编写为标签的 DetailView
,并将相关帖子添加到上下文中。
一种方式是否比另一种更合适——或 Pythonic——?
ListView
方法似乎更语义化,因为我想要的是帖子的列表,但它也稍微复杂一些。它要求我覆盖两个方法。 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
最佳答案
根据经验,查看 URL 中的参数。如果您使用的是 Tag
的 slug
,那么您最有可能处理的是 DetailView
而不是 ListView
.
在这种情况下,第二种方法使用更少的代码并且更优雅。但是,这也取决于您稍后要对 View 执行的操作。如果您要添加表单来编辑帖子,那么使用 ListView
可能更有意义。但是,没有技术上的理由要偏爱其中一种方法,只是您最终可能会用一种方法编写比另一种方法更多的代码。
关于python - Django 通用 View : When to use ListView vs. DetailView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777121/