基于类的视图VS基于视图

创builddjango应用程序时,我总是使用FBV(基于function的视图),因为它很容易处理。 但是大多数开发人员表示,使用CBV(基于类的视图)更好,如果复杂的视图使用CBV,那么使用FBV会更好。

为什么? 使用CBV有什么好处?

唯一最重要的优点是inheritance。 在一个大型的项目中,你可能会有很多类似的观点。 而不是一次又一次地写相同的代码,你可以简单地让你的视图从基本视图inheritance。

此外,Django提供了一些通用视图类的集合,可用于执行一些最常见的任务。 例如,DetailView类用于传递一个模型中的单个对象,使用模板渲染并返回http响应。 你可以直接插入你的urlconf ..

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

或者你可以用自定义function扩展它

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

两个问题的一些话

提示替代Apporach – 保持与FBVs

有些开发人员更喜欢在大多数视图中使用FBV,而只在需要被分类的视图上使用CBV。 这个策略也很好。

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

CBV的主要好处和与之相伴的多重inheritance是我完全可以避免写信号,辅助方法和复制粘贴代码。 尤其是在应用程序比基本的CRUD操作更多的情况下。 具有多重inheritance的视图多次更容易debugging具有信号和辅助方法的代码,特别是如果它是未知的代码库。

除了通过提供不同的方法来执行调度,检索模板,处理不同的请求types,传递模板上下文variables,validation表单以及更多开箱即用之外,多重inheritanceCBV也是如此。 这些使代码模块化,因此可维护。

如果你想在你的Django应用程序中实现一个全function的CRUD操作 ,那么基于类的视图是非常好的,同样的,使用基于函数的视图也需要很less的时间和精力。

当你不打算在你的网站/应用程序上实现任何CRUD时,我会build议你使用基于function的视图意味着你的意图是简单地呈现模板。

我已经创build了一个简单的基于CRUD的应用程序,使用基于类的视图是现场。 访问http://filtron.pythonanywhere.com/view/并享受。; 那么你会知道它的重要性。