基于类的视图 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 基于函数的视图的主要内容,如果未能解决你的问题,请参考以下文章