Django vs. Model View Controller [geschlossen]

109

Kann mir jemand erklären, wo die Unterschiede zwischen Django und dem Model View Controller-Muster liegen?

Was können wir funktional von diesen Unterschieden erwarten - dh was funktioniert anders, wenn Django beispielsweise mit Ruby on Rails verglichen wird?

Leonardo
quelle
2
Wenn Sie "Model View Controller" sagen, meinen Sie damit das allgemeine Muster oder eine bestimmte Implementierung (wie Ruby on Rails)?
Paul D. Waite
33
Diese Frage gilt nicht als "nicht konstruktiv" und hat eine direkte Antwort ohne "Debatte, Argumente, Umfragen oder erweiterte Diskussion". Warum dann schließen?
Benutzer
6
nicht konstruktiv? SO schlagen Super Mods wieder zu.
Amit Tripathi
4
Bis heute fanden fast 24.000 Menschen diese Frage konstruktiv. Inklusive mir.
Frozenjim
3
Ab 2017 ist diese Frage noch konstruktiv
Leonardo Pessoa

Antworten:

139

Laut dem Django-Buch folgt Django dem MVC-Muster genau genug, um als MVC-Framework bezeichnet zu werden.

Django wurde als MTV-Framework bezeichnet, da der Controller vom Framework selbst verwaltet wird und der größte Teil der Aufregung in Modellen, Vorlagen und Ansichten auftritt.

Weitere Informationen zu MTV / MVC finden Sie hier:

Das MTV- (oder MVC-) Entwicklungsmuster

Wenn Sie mit anderen MVC-Webentwicklungsframeworks wie Ruby on Rails vertraut sind, können Sie Django-Ansichten als Controller und Django-Vorlagen als Ansichten betrachten .

Dies ist eine unglückliche Verwirrung, die durch unterschiedliche Interpretationen von MVC hervorgerufen wird.

In Djangos Interpretation von MVC beschreibt die Ansicht die Daten, die dem Benutzer präsentiert werden. Es geht nicht unbedingt nur darum, wie die Daten aussehen, sondern welche Daten präsentiert werden.

Im Gegensatz dazu schlagen Ruby on Rails und ähnliche Frameworks vor, dass die Aufgabe des Controllers darin besteht, zu entscheiden, welche Daten dem Benutzer präsentiert werden, während die Ansicht ausschließlich dem Aussehen der Daten und nicht den Daten entspricht.

Paolo Moretti
quelle
6
Danke für die tolle Antwort. Wenn ich von Rails nach Django komme, beantwortet dies eines der Dinge, die ich am frustrierendsten fand: Warum fügt django den Controller-Code in eine Datei namens views.py! Ein?
dgmdan
@dgmdan Es ist nur eine Standardkonvention, Sie können den Namen wählen, den Sie mögen. Aber ich stimme zu, es scheint seltsam :)
Paolo Moretti
Ich würde lieber views.py als Ansichtsebene belassen und eine Reihe von Controller-Klassen in einem Controller-Paket erstellen, um Djangos Verwirrung zu vermeiden.
Stanleyxu2005
5
@dgmda: Weil das Konzept eines "Controllers" in Webapps eine falsche Bezeichnung ist. MVC ist ein ereignisgesteuertes Framework, das nicht nur für das zustandslose REQUEST / RESPONSE-Modell von HTTP geeignet ist. Es sollte überhaupt nicht MVC heißen. Fast alle Webanwendungen sind keine MVC, sondern verwenden ein Modell und eine Funktion oder Klasse, die normalerweise als Ansicht bezeichnet wird. Die Ansicht wiederum kann das HTML-Rendering an eine Vorlage delegieren, muss dies jedoch nicht. Es gibt also eigentlich keinen Controller.
Lennart Regebro
2
Ich unterstütze Lennart Regebros Konzept, dass ein zustandsloses Modell wie HTTP keinen Controller und kein MVC-Modell für Webapps haben sollte, was nur zu großer Verwirrung führt
Hussam
23

Die Django-FAQ selbst ist ein guter Anfang:

In unserer Interpretation von MVC beschreibt die „Ansicht“ die Daten, die dem Benutzer präsentiert werden. Es ist nicht unbedingt so, wie die Daten aussehen, sondern welche Daten präsentiert werden. Die Ansicht beschreibt, welche Daten Sie sehen, nicht wie Sie sie sehen. Es ist eine subtile Unterscheidung.

...

Darüber hinaus ist es sinnvoll, Inhalte von Präsentationen zu trennen. Hier kommen Vorlagen ins Spiel. In Django beschreibt eine „Ansicht“, welche Daten präsentiert werden, aber eine Ansicht wird normalerweise an eine Vorlage delegiert, die beschreibt, wie die Daten präsentiert werden.

Wo passt dann der „Controller“ hin? In Djangos Fall ist es wahrscheinlich das Framework selbst: die Maschine, die eine Anforderung an die entsprechende Ansicht gemäß der Django-URL-Konfiguration sendet.

Wenn Sie hungrig nach Akronymen sind, können Sie sagen, dass Django ein "MTV" -Framework ist, dh "Modell", "Vorlage" und "Ansicht". Diese Aufschlüsselung ist viel sinnvoller.

Denken Sie daran, dass „Model View Controller“ nur ein Muster ist, dh ein Versuch, eine gemeinsame Architektur zu beschreiben. Eine bessere Frage könnte also lauten: "Wie gut passt Django zum Model View Controller-Muster?"

Paul D. Waite
quelle
3
Dies ist vielleicht die direkteste Antwort.
Benutzer
11

Wenn Sie codieren und nicht an Namen von Framework-Elementen denken, gibt es keine verdächtigen Unterschiede zwischen beispielsweise RoR. Dies hängt jedoch von der Verwendung ab, die Sie geben models, da sie auf Django leicht eine Logik enthalten, die auf anderen Frameworks auf Controller-Ebene bleiben würde.

Bei viewon Django handelt es sich in der Regel um eine Reihe von Abfragen zum Abrufen von Daten und zum Übergeben dieser Daten an die Vorlage.

inigomedina
quelle
10
Ein viewsin Django ist so etwas wie ein controllerin MVC und ein templatein Django ist eher einviews
Roel
7

In mvt wird eine Anforderung an eine URL an eine Ansicht gesendet. Diese Ansicht ruft das Modell auf, führt Manipulationen durch und bereitet Daten für die Ausgabe vor. Die Daten werden an eine Vorlage übergeben, die als Antwort ausgegeben und ausgegeben wird. Idealerweise ist der Controller in Web-Frameworks nicht sichtbar.

Hier liegt der Unterschied zu MVC: In MVC interagiert der Benutzer mit der GUI, der Controller verarbeitet die Anforderung und benachrichtigt das Modell, und die Ansicht fragt das Modell ab, um dem Benutzer das Ergebnis anzuzeigen.

Samuele Mattiuzzo
quelle