16

我在博客应用程序中使用 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
4

4 回答 4

10

根据经验,请查看 URL 中的参数。如果您使用 a slugof aTag那么您很可能处理的是 aDetailView而不是 a ListView

在这种情况下,第二种方法使用更少的代码并且更优雅。但是,这也取决于您稍后将如何处理视图。如果您要添加表单来编辑帖子,则改用 a 可能更有意义ListView。但是没有技术上的理由偏爱其中一种,只是您最终可能会在一种方法中编写比另一种方法更多的代码。

于 2012-03-19T20:21:14.943 回答
4

ListView 和 DetailView 在技术上并不相同,例如,您不能在 urls.py 中提供如下所示的 DetailView 的路径,

path('schools_detail/',views.SchoolDetailView.as_view(),name = "detail"),

这将给出以下错误,

通用详细视图 SchoolDetailView 必须使用 URLconf 中的对象 pk 或 slug 调用。

这意味着如果我们有一个名为 Student 的表和另一个名为 School 的表,我们可以使用 ListView 列出所有学校,如下所示,

path('list/',views.SchoolListView.as_view(),name = "list"),

如果我们想在单击学校图标时列出各个学校的学校详细信息,那么我们可以使用 Django 内部创建的 School 的主键并在 url 模式中捕获它,在我的情况下,url 模式将是“ list/{{school.id}}" 所以要捕捉到这一点,我们必须为 DetailsView 提供如下路径,

path('list/<int:pk>/',views.SchoolDetailView.as_view(),name = "detail"),

所以底线是,在大多数情况下,您可以将 ListView 用作普通视图,如果您想访问另一个视图,但只访问该视图中的特定详细信息,该详细信息用主键引用,那么您可以使用 DetailsView(用于DetailsView 将通过在 url 中提供主键信息来生成,如果 url 中没有主键,它将无法工作,因为它不会获取所有信息,而只会获取与 url 中的主键相关的信息)

于 2018-12-16T14:20:17.693 回答
2

有趣的问题。不幸的是,答案并不那么有趣:选择对您和您的应用最有意义的那个。对于任何一种方法都可以平等地提出论点,所以这实际上只是一个判断电话。

于 2012-03-19T20:17:58.907 回答
0

文章中完美地描述了基于类的通用视图的用例:

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views

在上面提到的文章中,您将能够知道何时/为什么以及如何使用 ListView/DetailView 以及简单的示例。

于 2018-11-21T09:05:27.333 回答