类视图 vs 函数视图

99 投票
7 回答
40352 浏览
提问于 2025-04-17 15:21

我在创建Django应用时总是使用FBVs(基于函数的视图),因为这样处理起来非常简单。不过,大多数开发者都说使用CBVs(基于类的视图)更好,只有在视图比较复杂、用CBVs实现起来很麻烦的时候才使用FBVs。

为什么会这样呢?使用CBVs有什么好处呢?

7 个回答

21

有些视图用类视图(CBVs)来实现效果更好,而有些则用函数视图(FBVs)来实现更合适。

如果你不确定该选择哪种方法,可以参考下面的图表:

在这里输入图片描述

29

刚开始接触Django的时候,我从来没有用过类视图(CBVs),因为它们的学习曲线有点陡峭,结构也比较复杂。两年多过去了,我现在只在少数地方使用函数视图(FBVs),那些地方我确定代码会非常简单,并且会一直保持简单。

类视图和它们带来的多重继承的最大好处是,我可以完全避免写信号、辅助方法和重复代码。尤其是在应用程序的功能远超基本的增删改查操作时,使用多重继承的视图比用信号和辅助方法的代码更容易调试,特别是当你面对一个不熟悉的代码库时。

除了多重继承,类视图还提供了多种方法来处理请求,比如分发请求、获取模板、处理不同类型的请求、传递模板上下文变量、验证表单等等。这些功能让代码变得模块化,因此更容易维护。

99

最重要的好处就是继承。在一个大型项目中,你可能会有很多相似的视图。与其一次又一次地写相同的代码,不如让你的视图从一个基础视图继承,这样就可以复用代码。

而且,Django自带了一些通用的视图类,可以用来处理一些最常见的任务。例如,DetailView类可以用来传递你模型中的一个单独对象,使用模板渲染它,并返回一个HTTP响应。你可以直接把它放进你的URL配置里。

url(r'^author/(?P<pk>\d+)/$', DetailView.as_view(model=Author)),

或者你也可以在这个基础上添加自定义功能。

class SpecialDetailView(DetailView):
    model = Author
    def get_context_data(self, *args, **kwargs):
        context = super(SpecialDetailView, self).get_context_data(*args, **kwargs)
        context['books'] = Book.objects.filter(popular=True)
        return context

这样一来,你的模板就会接收到一组书籍对象来进行渲染。

一个很好的入门方式是好好阅读一下文档(Django 4.0及以上版本)。

更新

ccbv.co.uk提供了关于你已经可以使用的基于类的视图的全面且易于使用的信息。

撰写回答