在创建 django 应用程序时,我总是使用 FBV(基于函数的视图),因为它很容易处理。但大多数开发人员表示,如果使用 CBV 实现复杂的视图会很痛苦,最好使用 CBV(基于类的视图)并仅使用 FBV。
为什么?使用 CBV 的优势是什么?
在创建 django 应用程序时,我总是使用 FBV(基于函数的视图),因为它很容易处理。但大多数开发人员表示,如果使用 CBV 实现复杂的视图会很痛苦,最好使用 CBV(基于类的视图)并仅使用 FBV。
为什么?使用 CBV 的优势是什么?
唯一最显着的优势是继承。在一个大型项目中,您可能会有很多类似的视图。无需一次又一次地编写相同的代码,您可以简单地让您的视图从基本视图继承。
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拥有全面且易于使用的关于您已经可用的基于类的视图的信息。
当我开始使用 DJango 时,我从未使用过 CBV,因为它们的学习曲线和结构有点复杂。快进两年多,我只在少数地方使用 FBV。我确信代码将非常简单并且将保持简单。
CBV 和随之而来的多重继承的主要好处是我可以完全避免编写信号、辅助方法和复制粘贴代码。尤其是在应用程序所做的远远超过基本 CRUD 操作的情况下。具有多重继承的视图比带有信号和辅助方法的代码更容易调试,尤其是在它是未知代码库的情况下。
除了多继承 CBV 之外,还提供了不同的方法来执行分派、检索模板、处理不同的请求类型、传递模板上下文变量、验证表单等等。这些使代码模块化,因此可维护。
两勺的一些话
提示替代方法 - 使用 FBV
一些开发人员宁愿错误地将 FBV 用于大多数视图,而将 CBV 仅用于需要子类化的视图。这个策略也不错。
如果您想在 Django 应用程序中实现功能齐全的CRUD 操作,则基于类的视图非常好,并且使用基于函数的视图实现同样需要很少的时间和精力。
当您不打算在您的站点/应用程序上实现任何CRUD时,我会建议您使用基于函数的视图,这意味着您的意图是简单地呈现模板。
我使用基于类的实时视图创建了一个简单的基于CRUD的应用程序。访问http://filtron.pythonanywhere.com/view/(现在将/不会工作)并享受。然后你就会知道它的重要性。
在我看不到扩展视图的真正机会的大多数情况下,我一直在使用 FBV。如文档中所述,如果以下两个特征适合我的用例,我会考虑选择 CBV。
- 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。
- Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components.