Django与模型视图控制器


110

有人可以解释一下Django和Model View Controller模式之间的区别吗?

从功能上讲,我们可以从这些差异中得到什么?例如,将Django与Ruby on Rails进行比较,有什么不同?


2
当您说“ the” Model View Controller时,您是指一般模式还是特定的实现(例如Ruby on Rails)?
Paul D. Waite

33
这个问题不算是“非建设性的”,没有“辩论,争论,民意测验或扩展讨论”就可以直接回答。那为什么要关闭它呢?
用户

6
不是建设性的?SO超级MOD再次罢工。
阿米特·特里帕蒂

4
截至今天,将近24,000人发现此问题具有建设性。包括我自己。
Frozenjim

3
截至2017年,此问题仍具有建设性
莱昂纳多·佩索阿

Answers:


140

根据Django书,Django遵循MVC模式的程度非常接近,可以称为MVC框架。

Django之所以称为MTV框架,是因为控制器由框架本身处理,并且大多数兴奋都发生在模型,模板和视图中。

您可以在此处阅读有关MTV / MVC的更多信息:

MTV(或MVC)开发模式

如果您熟悉其他MVC Web开发框架(例如Ruby on Rails),则可以将Django视图作为控制器,而将Django模板视为视图

不幸的是,由于对MVC的不同解释而引起的混乱。

在Django对MVC的解释中,视图 描述了呈现给用户的数据。它不一定只是数据的外观,而是呈现的数据。

相反,Ruby on Rails和类似的框架建议控制器的工作包括确定将哪些数据呈现给用户,而视图严格来说是数据的外观,而不是呈现的数据。


6
感谢您的出色回答。从Rails到Django,这回答了我发现最令人沮丧的事情之一:django为什么将控制器代码放在名为views.py!的文件中?
dgmdan

@dgmdan这只是默认约定,您可以选择所需的名称。但我同意,这似乎很奇怪:)
Paolo Moretti

1
我宁愿将views.py保留为视图层,并在控制器包中创建一组控制器类,以避免Django的混乱。
stanleyxu2005

5
@dgmda:因为“控制器”的概念在webapps中是用词不当。MVC是一个事件驱动的框架,不仅仅适合HTTP的无状态REQUEST / RESPONSE模型。首先不应该将其称为MVC。几乎所有的Web应用程序都不是MVC,而是使用通常称为View的模型和函数或类。反过来,View可以将HTML呈现委派给模板,但不需要这样做。因此,实际上没有控制器。
Lennart Regebro

2
我支持Lennart Regebro的概念,即HTTP之类的无状态模型不应具有控制器,Web应用程序的MVC模型只会带来重大混乱
Hussam 2014年

23

Django FAQ本身是一个不错的起点:

在我们对MVC的解释中,“视图”描述了呈现给用户的数据。不一定是数据的外观,而是要呈现的数据。该视图描述的是您看到的数据,而不是如何查看。这是一个微妙的区别。

...

此外,将内容与表示分开是明智的,这就是模板的来源。在Django中,“视图”描述了要显示的数据,但是视图通常委托给模板,后者描述了如何显示数据。

那么,“控制器”适合放在哪里?在Django的情况下,可能是框架本身:根据Django URL配置将请求发送到适当视图的机器。

如果您渴望首字母缩略词,则可以说Django是一个“ MTV”框架-即“模型”,“模板”和“视图”。这种故障更有意义。

请记住,“模型视图控制器”仅是一种模式,即尝试描述通用架构。因此,一个更好的问题可能是“ Django如何适合Model View Controller模式?”


3
这也许是最直接的答案。
用户

11

当您编写代码时,不用考虑框架的名称,两者之间就没有任何区别,例如RoR。但这取决于您提供的用途models,因为在Django上,它们很容易包含某些逻辑,而这些逻辑在其他框架上将停留在控制器级别。

viewDjango上往往是一组用于读取数据的查询,并传递给模板。


10
viewsDjango中的A 类似于controllerMVC中的a template,而Django中的a更可能是views
Roel

7

在mvt中,对URL的请求将分派给View。该视图调用模型,执行操作并准备数据以供输出。数据将传递到一个模板,该模板将作为响应发出。理想情况下,在Web框架中,控制器是隐藏起来的。

这与MVC的区别在于:在mvc中,用户与gui交互,控制器处理请求并通知模型,视图则查询模型以将结果显示给用户。

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.