Django - 是否使用通用视图?

9 投票
3 回答
4193 浏览
提问于 2025-04-16 20:19

我在Django网站上看了一个快速投票的教程,最后一部分是关于通用视图的介绍。这是一种方便的方法,可以避免为每个URL模式创建自定义视图。

根据我的理解,主要的想法是这样的:

1) 请求 -> URL模式 -> 视图 -> 模板

或者

2) 请求 -> URL模式(通用视图)[-> 可选模板]

第二种方式似乎需要的代码更少,只有两个步骤,而不是四个。不过,缺点是你把更多的东西放进了URL模式里,自动化的东西也更多了,而且你的视图现在在两个地方定义。

我很喜欢把URL模式仅仅当作模式的想法,而不想添加额外的模板代码。我也喜欢把所有的视图都明确地定义出来,即使是简单的视图,这样我以后就知道在哪里找到它们,而不用来回翻文件。而且我们都知道,任何自动化的东西都比从头开始构建的东西更难以自定义(至少在Django的基础上)。

我是不是漏掉了什么?如果我完全不使用通用视图,是不是会犯一个大错误,以后会让我很头疼?

3 个回答

2

在Django 1.2中,我使用通用视图,但是在一个“普通”的视图里,而不是在urls里,像这样:

#views.py
import generic_views

def my_generic_list(request):
    qs = Something.objects.filter(some arguments)
    return generic.object_list(queryset = qs, ... other stuff, usually extra_context)

这样做(我觉得)这个视图非常简单,但如果需要改动的话,它可以变得“真实”,而urls.py文件保持干净整洁。

3

使用通用视图还是自己写视图完全取决于你。这样做不会给你带来麻烦,不过你可能会发现自己在写重复的视图逻辑。你可以考虑在你的 views.py 文件中使用包装过的或子类化的通用视图(通常你会想要对它们进行一些自定义),这样可以让你的 urls.py 文件更简洁,同时把所有视图放在一个地方,方便管理。

10

通用视图的目的是为了减少重复代码。当你在多个视图中使用相似的代码时,这个功能就特别有用。其实,你应该仅仅把它用在这个地方。简单来说,虽然django允许你以通用的方式做某些事情,但这并不意味着你就应该这样做,尤其是当你的代码变得不如你所愿的时候。

如果你在使用django-1.3的基于类的视图,与你在urls.py中传递很多变量相比,你可以重写一些你感兴趣的方法,这样就能兼顾两者的优点——代码更少,控制更多。

撰写回答