python - Django 通用 View : When to use ListView vs. DetailView

标签 python django django-views django-generic-views

我在博客应用程序中使用 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 中的参数。如果您使用的是 Tagslug,那么您最有可能处理的是 DetailView 而不是 ListView.

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

关于python - Django 通用 View : When to use ListView vs. DetailView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777121/

相关文章:

python - 使用 PyAudio 和 TK 在按键上演奏音符

python - 从兄弟目录导入模块以与 py.test 一起使用

使用继承和外键时,Django syncdb 冲突related_name

django - django 中的自定义登录 URL

python - Django:如何从 POST 请求获取任意模型

python - Django 表单仅发送文件字段

python - 对称稀疏矩阵的高效切片

python - 使用 contextvar 跟踪 Python 中的异步循环

Django AND .htaccess 重写/重定向,这可能吗?

python - 如何从django信号返回数据?