Django通用视图:何时使用ListView与DetailView

use*_*534 15 python django django-views django-generic-views

我在博客应用程序中使用Django基于类的通用视图.我的一个视图显示了具有特定标记的帖子列表.我可以将此视图写ListView为帖子,按标签过滤.或者我可以将此视图编写为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
Run Code Online (Sandbox Code Playgroud)

Sim*_*ser 9

根据经验,请查看URL中的参数.如果你正在使用a slug,Tag那么你最有可能处理a DetailView而不是a ListView.

在这种情况下,第二种方法使用更少的代码,它更优雅.但是,它还取决于您稍后要对视图执行的操作.如果您要添加表单来编辑帖子,则可以使用ListView替代方法.但是没有技术上的理由偏爱另一个,只是你最终可能会在一种方法中编写更多的代码而不是另一种方法.

  • @DanGayle:`DetailView`不应该被分页,它只能用于一个对象. (2认同)