基于类的视图 VS 基于函数的视图

Posted

技术标签:

【中文标题】基于类的视图 VS 基于函数的视图【英文标题】:Class Based Views VS Function Based Views 【发布时间】:2013-01-25 03:22:11 【问题描述】:

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

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

【问题讨论】:

“大多数开发者”?真的吗?我比较怀疑。就我个人而言,虽然我认识到 CBV 在某些情况下很好用,但我几乎从不使用它们。 是的,这在我读过的书中有说明,但我不知道。我真的很喜欢使用 FBV 而不是 CBV。 @DanielRoseman 如果丹尼尔不使用 cbv,我现在不再担心不知道也不使用 cbv.. @catherine 你还坚持使用 FBV 还是换了一边? 【参考方案1】:

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

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

现在您的模板将被传递一组用于渲染的书籍对象。

一个很好的起点是阅读docs(Django 3.2+)。

更新

ccbv.co.uk 提供全面且易于使用的有关您已有的基于类的视图的信息。

【讨论】:

@meshy cbv的域名,一定有人真的很喜欢cbv! 文档链接失效,应该是docs.djangoproject.com/en/1.9/topics/class-based-views 哇——太糟糕了,他们已经杀死了 1.4 文档——我曾经定期链接到文档——保留版本号以确保答案保持正确。无论如何,谢谢@Tanner - 我已经更新了这个答案。 @AidanEwen 我看到有人链接到开发版:djangoproject.com/en/dev/topics/blah【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

两勺的一些话

提示替代方法 - 使用 FBV

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

filtron.pythonanywhere.com/view 不工作【参考方案6】:

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

与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来处理。 可以使用 mixins(多重继承)等面向对象的技术将代码分解为可重用的组件。

【讨论】:

以上是关于基于类的视图 VS 基于函数的视图的主要内容,如果未能解决你的问题,请参考以下文章

Django中基于函数的视图和基于类的视图以及路由传参

基于类的视图简介

django-基于类的视图

在 Django 的基于类的视图中模拟函数

CVB:基于类的视图函数,resful规范,序列化

Django中基于类的视图上带有参数的函数装饰器