Django対Model View Controller [終了]


109

誰かがDjangoとModel View Controllerパターンの違いを説明してもらえますか?

機能的には、これらの違いから何を期待できますか。つまり、DjangoをRuby on Railsなどと比較すると動作が異なるのは何ですか。


2
「The」モデルビューコントローラとは、一般的なパターンですか、それとも特定の実装(Ruby on Railsなど)ですか?
ポールD.ウェイト2011

33
この質問は「建設的ではない」とは見なされず、「議論、議論、投票、または拡張ディスカッション」なしで簡単な回答が得られます。なぜそれを閉じるのですか?
ユーザー

6
建設的ではない?SOスーパーMODが再びストライキします。
Amit Tripathi 2016

4
今日の時点で、約24,000人がこの質問を建設的に考えています。自分も含めて。
frozenjim

3
2017年現在、この質問はまだ建設的です
レオナルドペソア

回答:


139

Django Bookによると、DjangoはMVCフレームワークと呼ばれるほど十分にMVCパターンに従っています。

DjangoはMTVフレームワークと呼ばれています。これは、コントローラーがフレームワーク自体によって処理され、興奮のほとんどがモデル、テンプレート、およびビューで発生するためです。

MTV / MVCの詳細については、こちらをご覧ください。

MTV(またはMVC)開発パターン

Ruby on Railsなどの他のMVC Web開発フレームワークに精通している場合は、Djangoビューをコントローラーと見なし、Djangoテンプレートをビューと見なすことができます

これは、MVCの異なる解釈によって引き起こされる不幸な混乱です。

DjangoのMVCの解釈では、ビュー はユーザーに提示されるデータを記述します。データがどのように表示されるかだけでなく、どのデータが表示されるかは異なります。

対照的に、Ruby on Railsや類似のフレームワークは、コントローラーの仕事にはユーザーに提示するデータを決定することが含まれているのに対し、ビューは厳密にはデータがどのように表示されるかではなく、データがどのように表示されるかを示しています。


6
素晴らしい答えをありがとう。これはRailsからDjangoに至るまで、私が最も苛立たしいことの1つに答えます:djangoはなぜコントローラのコードをviews.py!というファイルに入れるのですか?
dgmdan 2013

@dgmdanこれは単なるデフォルトの規則であり、好きな名前を選択できます。しかし、私は同意します、それは奇妙に見えます:)
Paolo Moretti

Djangoの混乱を避けるために、views.pyをビューレイヤーとして残し、コントローラークラスのセットをコントローラーパッケージに作成します。
stanleyxu2005 2013

5
@dgmda:「コントローラー」の概念は、webappsでは誤称です。MVCは、HTTPのステートレスREQUEST / RESPONSEモデルだけに適合しないイベント駆動型フレームワークです。そもそもMVCと呼ばれるべきではありません。ほとんどすべてのWebアプリはMVCではありませんが、モデルと、通常ビューと呼ばれる関数またはクラスを使用します。ビューは、HTMLレンダリングをテンプレートに委任できますが、そうする必要はありません。つまり、実際にはコントローラーはありません。
Lennart Regebro 2013年

2
私はLennart Regebroの概念を支持します。HTTPのようなステートレスモデルにはコントローラーがなく、webappsのMVCモデルは大きな混乱を招くだけです
Hussam

23

Django FAQ自体は、まず始めに適切な場所です。

MVCの解釈では、「ビュー」はユーザーに提示されるデータを示します。それは必ずしもデータがどのように見えるかではなく、どのデータが表示されるかです。ビューは、どのように表示するかではなく、どのデータを表示するかを示します。それは微妙な違いです。

...

さらに、コンテンツをプレゼンテーションから分離することは賢明です。これは、テンプレートが入る場所です。Djangoでは、「ビュー」はどのデータが表示されるかを記述しますが、ビューは通常、データの表示方法を記述するテンプレートに委任します。

では、「コントローラ」はどこに収まるのでしょうか。Djangoの場合、それはおそらくフレームワーク自体です。DjangoのURL構成に従って、リクエストを適切なビューに送信するメカニズムです。

頭字語に飢えている場合、Djangoは「MTV」フレームワーク、つまり「モデル」、「テンプレート」、「ビュー」であると言えるでしょう。その内訳はもっと理にかなっています。

「Model View Controller」は単なるパターン、つまり一般的なアーキテクチャを説明する試みであることを覚えておいてください。より良い質問は、「DjangoはどのようにModel View Controllerパターンに適合するか」ということになるかもしれません。


3
これがおそらく最も直接的な答えです。
ユーザー

11

フレームワークのピースの名前を考えずにコーディングする場合、RoRなど、明確な違いはありません。ただしmodels、Djangoでは、他のフレームワークではコントローラーレベルに留まるロジックを簡単に含めることができるため、使用方法によって異なります。

viewジャンゴには、データをフェッチするための照会のセットで、テンプレートに渡す傾向があります。


10
viewsDjangoのA はcontrollerMVCのようなものでありtemplate、Djangoのa はより可能性が高いviews
Roel

7

mvtでは、URLへのリクエストがビューにディスパッチされます。このビューはモデルを呼び出し、操作を実行し、データを出力用に準備します。データは、応答として発行されるようにレンダリングされるテンプレートに渡されます。理想的には、Webフレームワークでは、コントローラーは表示されません。

ここがMVCとの違いです。mvcでは、ユーザーがGUIと対話し、コントローラーが要求を処理してモデルに通知し、ビューがモデルにクエリを実行して結果をユーザーに表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.