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

99

我通常在创建django应用程序时使用FBVs(基于函数的视图),因为它非常容易处理。但是大多数开发人员说最好使用CBVs(基于类的视图),仅在使用CBVs实现复杂视图会很麻烦时才使用FBVs。

为什么?使用CBV有什么优点呢?

7个回答

98
在编程中,最重要的优势是继承。在大型项目中,很可能会有许多类似的视图。您可以让您的视图从基础视图继承,而不是一遍又一遍地编写相同的代码。
此外,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

现在您的模板将被传递一个书籍对象集合进行渲染。
阅读docs(Django 4.0+)是一个不错的开始。 更新 ccbv.co.uk提供了关于已有类视图的全面易用信息。

29
当我开始使用DJango时,我从来没有使用过CBVs,因为它们的学习曲线和稍微复杂的结构。快进两年多,我只在少数几个地方使用FBVs。我确定代码会非常简单,并且会保持简单的地方。
CBVs和多重继承的主要好处是我可以完全避免编写信号、辅助方法和复制粘贴的代码。特别是在应用程序执行的操作远远超出基本的CRUD操作的情况下,具有多重继承的视图比具有信号和辅助方法的代码更容易调试,尤其是在一个未知的代码库中。
除了多重继承之外,CBVs还提供了不同的方法来进行分派、检索模板、处理不同的请求类型、传递模板上下文变量、验证表单等等。这些使代码具有模块化,因此易于维护。

21

有些视图最好作为类视图实现(CBVs),而其他视图则最好作为函数视图实现(FBVs)。

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

enter image description here


19

两个概念的比较:使用FBV和CBV

提示:另一种选择——坚持使用FBV

一些开发者倾向于在大多数情况下使用FBV,而仅在需要子类化视图时才使用CBV。这种策略也是可以的。


11
Class based views非常适合在Django应用程序中实现完全功能的CRUD操作,而使用基于函数的视图则需要更少的时间和精力来实现。如果您不打算在网站/应用程序上实现任何CRUD操作,只是想简单地呈现模板,则建议您使用基于函数的视图。我使用基于类的视图创建了一个简单的基于CRUD的应用程序,它已经上线。访问http://filtron.pythonanywhere.com/view/(现在可能会/不会工作),并享受其中的乐趣。那么你就会知道它的重要性。

http://filtron.pythonanywhere.com/view/ 不可用。 - Cornel Ciobanu

0

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

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

-1

基于函数的视图(FBVs)是:

  • 易于使用,但
  • 代码不能通过继承重用。
  • 建议使用

基于类的视图(CBVs)是:

  • 学习曲线太高,因为它非常复杂
  • 代码可以通过继承重用。
  • 不建议使用(FBVs更好)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接