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


73

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

为什么?使用CBV有什么优势?


13
“大多数开发人员”?真?我对此表示怀疑。就个人而言,尽管我认识到CBV在某些情况下是好的,但我几乎从不使用它们。
Daniel Roseman

2
是的,这是我读过的书中所述的内容,但我对此一无所知。我真的很喜欢使用FBV,而不是CBV。
catherine

8
@DanielRoseman,如果丹尼尔不使用cbv,我现在停止担心不知道和不使用cbv
。.– doniyor

Answers:


77

最重要的优点是继承。在大型项目中,您可能会有很多相似的视图。不必一次又一次地编写相同的代码,只需让视图从基本视图继承即可。

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

现在,您的模板将传递一个书本对象集合以进行渲染。

从这里开始的一个不错的地方是对文档有很好的阅读。

更新资料

ccbv.co.uk拥有关于您已经可以使用的基于类的视图的全面且易于使用的信息。


3
@meshy cbv的域名,一定有人真的爱cbv!
NeoWang 2015年


哇-很糟糕,他们杀死了1.4文档-我过去经常链接到文档-保留版本号以确保答案正确。无论如何,谢谢@Tanner-我已经更新了这个答案。
艾丹·埃文

1
@AidanEwen我见过有人链接到开发版本:djangoproject.com/en/dev/topics/blah
Tanner

17

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

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

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


14

两种语言的一些单词

小费替代方法-与FBV一起使用

一些开发人员更倾向于在大多数视图中使用FBV,而在需要子类化的视图中仅使用CBV。该策略也很好。


11

某些视图最好实现为CBV,而其他视图最好实现为FBV。

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

在此处输入图片说明


8

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

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

我使用实时的基于类的视图创建了一个简单的基于CRUD的应用程序。访问http://filtron.pythonanywhere.com/view/(将/现在将无法使用)并享受。然后,您将了解它的重要性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.