90

在创建 django 应用程序时,我总是使用 FBV(基于函数的视图),因为它很容易处理。但大多数开发人员表示,如果使用 CBV 实现复杂的视图会很痛苦,最好使用 CBV(基于类的视图)并仅使用 FBV。

为什么?使用 CBV 的优势是什么?

4

6 回答 6

91

唯一最显着的优势是继承。在一个大型项目中,您可能会有很多类似的视图。无需一次又一次地编写相同的代码,您可以简单地让您的视图从基本视图继承。

django 还附带了一组通用视图类,可用于执行一些最常见的任务。例如,DetailView 类用于从您的一个模型传递单个对象,使用模板渲染它并返回 http 响应。您可以将其直接插入您的 url conf ..

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拥有全面且易于使用的关于您已经可用的基于类的视图的信息。

于 2013-02-09T14:31:47.537 回答
25

当我开始使用 DJango 时,我从未使用过 CBV,因为它们的学习曲线和结构有点复杂。快进两年多,我只在少数地方使用 FBV。我确信代码将非常简单并且将保持简单。

CBV 和随之而来的多重继承的主要好处是我可以完全避免编写信号、辅助方法和复制粘贴代码。尤其是在应用程序所做的远远超过基本 CRUD 操作的情况下。具有多重继承的视图比带有信号和辅助方法的代码更容易调试,尤其是在它是未知代码库的情况下。

除了多继承 CBV 之外,还提供了不同的方法来执行分派、检索模板、处理不同的请求类型、传递模板上下文变量、验证表单等等。这些使代码模块化,因此可维护。

于 2015-07-08T16:22:44.483 回答
18

两勺的一些话

提示替代方法 - 使用 FBV

一些开发人员宁愿错误地将 FBV 用于大多数视图,而将 CBV 仅用于需要子类化的视图。这个策略也不错。

于 2015-06-02T19:43:03.633 回答
18

一些视图最好作为 CBV 来实现,而另一些视图最好作为 FBV 来实现。

如果您不确定选择哪种方法,请参阅下表:

enter image description here

于 2019-06-20T05:07:51.333 回答
10

如果您想在 Django 应用程序中实现功能齐全的CRUD 操作,则基于类的视图非常好,并且使用基于函数的视图实现同样需要很少的时间和精力。

当您不打算在您的站点/应用程序上实现任何CRUD时,我会建议您使用基于函数的视图,这意味着您的意图是简单地呈现模板。

我使用基于类的实时视图创建了一个简单的基于CRUD的应用程序。访问http://filtron.pythonanywhere.com/view/(现在将/不会工作)并享受。然后你就会知道它的重要性。

于 2017-04-19T09:20:17.927 回答
0

在我看不到扩展视图的真正机会的大多数情况下,我一直在使用 FBV。如文档中所述如果以下两个特征适合我的用例,我会考虑选择 CBV。

  • 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。
  • Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components.
于 2021-09-02T19:00:44.403 回答