Django เทียบกับ Model View Controller [ปิด]


110

ใครช่วยอธิบายหน่อยได้ไหมว่าความแตกต่างระหว่าง Django กับรูปแบบ Model View Controller

ตามหน้าที่แล้วเราคาดหวังอะไรจากความแตกต่างเหล่านั้นนั่นคือสิ่งที่ทำงานแตกต่างกันเมื่อเปรียบเทียบ Django กับตัวอย่างเช่น Ruby on Rails


2
เมื่อคุณพูดว่า“ the” Model View Controller คุณหมายถึงรูปแบบทั่วไปหรือการใช้งานเฉพาะ (เช่น Ruby on Rails)?
Paul D.Waite

33
คำถามนี้ไม่เข้าข่าย "ไม่สร้างสรรค์" และมีคำตอบตรงไปตรงมาโดยไม่มี "การอภิปรายโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม" ทำไมถึงปิดล่ะ?
ผู้ใช้

6
ไม่สร้างสรรค์? SO super mods โจมตีอีกครั้ง
Amit Tripathi

4
ณ วันนี้ผู้คนเกือบ 24,000 คนพบว่าคำถามนี้สร้างสรรค์ รวมทั้งตัวเอง.
frozenjim

3
ในปี 2560 คำถามนี้ยังคงสร้างสรรค์
Leonardo Pessoa

คำตอบ:


140

ตามDjango Book Django ติดตามรูปแบบ MVC อย่างใกล้ชิดมากพอที่จะเรียกว่าเฟรมเวิร์ก MVC

Django ถูกเรียกว่าเป็นเฟรมเวิร์ก MTV เนื่องจากคอนโทรลเลอร์ได้รับการจัดการโดยเฟรมเวิร์กเองและความตื่นเต้นส่วนใหญ่เกิดขึ้นในโมเดลเทมเพลตและมุมมอง

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ MTV / MVC ได้ที่นี่:

รูปแบบการพัฒนา MTV (หรือ MVC)

ถ้าคุณคุ้นเคยกับกรอบ MVC เว็บการพัฒนาอื่น ๆ เช่น Ruby on Rails คุณอาจพิจารณามุมมอง Django จะเป็นตัวควบคุมและแม่ Django จะเป็นมุมมอง

นี่เป็นความสับสนที่น่าเสียดายที่เกิดจากการตีความ MVC ที่แตกต่างกัน

ในการตีความ MVC ของ Django มุมมองจะ อธิบายถึงข้อมูลที่นำเสนอต่อผู้ใช้ ไม่จำเป็นต้องเป็นเพียงลักษณะของข้อมูล แต่เป็นข้อมูลที่นำเสนอ

ในทางตรงกันข้าม Ruby on Rails และเฟรมเวิร์กที่คล้ายกันแนะนำว่างานของคอนโทรลเลอร์นั้นรวมถึงการตัดสินใจว่าจะนำเสนอข้อมูลใดให้กับผู้ใช้ในขณะที่มุมมองเป็นลักษณะของข้อมูลอย่างเคร่งครัดไม่ใช่ข้อมูลที่จะถูกนำเสนอ


6
ขอบคุณสำหรับคำตอบที่ดี มาจาก Rails ไปยัง Django สิ่งนี้ตอบโจทย์สิ่งหนึ่งที่ฉันพบว่าน่าหงุดหงิดที่สุด: ทำไม django จึงใส่รหัสคอนโทรลเลอร์ในไฟล์ชื่อ views.py!?
dgmdan

@dgmdan มันเป็นเพียงแบบแผนเริ่มต้นคุณสามารถเลือกชื่อที่คุณต้องการได้ แต่ฉันเห็นด้วยดูเหมือนจะแปลก :)
Paolo Moretti

1
ฉันอยากจะปล่อยให้ views.py เป็นเลเยอร์มุมมองและสร้างชุดของคลาสคอนโทรลเลอร์ลงในแพ็คเกจคอนโทรลเลอร์เพื่อหลีกเลี่ยงความสับสนของ Django
stanleyxu2005

5
@dgmda: เนื่องจากแนวคิดของ "คอนโทรลเลอร์" คือการเรียกชื่อผิดใน webapps MVC เป็นเฟรมเวิร์กที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งไม่เหมาะกับโมเดลคำขอ / การตอบสนองแบบไม่ระบุสถานะของ HTTP เท่านั้น ไม่ควรเรียกว่า MVC ตั้งแต่แรก เว็บแอพเกือบทั้งหมดไม่ใช่ MVC แต่ใช้โมเดลและฟังก์ชันหรือคลาสที่มักเรียกว่า View ในทางกลับกัน View สามารถมอบหมายการแสดง HTML ให้กับเทมเพลต แต่ไม่จำเป็นต้องทำ จริงๆแล้วไม่มีตัวควบคุม
Lennart Regebro

2
ฉันย้อนแนวคิดของ Lennart Regebro ที่ว่าโมเดลไร้สัญชาติเช่น HTTP ไม่ควรมีคอนโทรลเลอร์และโมเดล MVC สำหรับเว็บแอพทำให้เกิดความสับสน
Hussam

23

คำถามที่พบบ่อยของ Django เป็นจุดเริ่มต้นที่ดี:

ในการตีความ MVC ของเรา "มุมมอง" อธิบายถึงข้อมูลที่นำเสนอต่อผู้ใช้ ไม่จำเป็นว่าข้อมูลจะมีลักษณะอย่างไร แต่จะนำเสนอข้อมูลใด ข้อมูลพร็อพเพอร์ตี้จะอธิบายว่าคุณเห็นข้อมูลใดไม่ใช่ข้อมูลที่คุณเห็น มันเป็นความแตกต่างที่ลึกซึ้ง

...

นอกจากนี้ควรแยกเนื้อหาออกจากการนำเสนอซึ่งเป็นที่มาของเทมเพลตใน Django "มุมมอง" จะอธิบายว่าข้อมูลใดถูกนำเสนอ แต่โดยปกติมุมมองจะมอบสิทธิ์ให้กับเทมเพลตซึ่งจะอธิบายถึงวิธีการนำเสนอข้อมูล

แล้ว“ คอนโทรลเลอร์” อยู่ตรงไหน? ในกรณีของ Django อาจเป็นกรอบงานเอง: เครื่องจักรที่ส่งคำขอไปยังมุมมองที่เหมาะสมตามการกำหนดค่า URL ของ Django

หากคุณหิวกับคำย่อคุณอาจพูดได้ว่า Django เป็นเฟรมเวิร์ก "MTV" นั่นคือ "โมเดล" "เทมเพลต" และ "มุมมอง" รายละเอียดดังกล่าวมีความหมายมากกว่านั้น

โปรดจำไว้ว่า "Model View Controller" เป็นเพียงรูปแบบเท่านั้นกล่าวคือความพยายามที่จะอธิบายสถาปัตยกรรมทั่วไป ดังนั้นคำถามที่ดีกว่าคือ“ Django เหมาะกับรูปแบบ Model View Controller ได้ดีแค่ไหน?”


3
นี่อาจเป็นคำตอบที่ตรงที่สุด
ผู้ใช้

11

เมื่อคุณเขียนโค้ดโดยไม่คิดเกี่ยวกับชื่อของเฟรมเวิร์กจะไม่มีความแตกต่างที่ชัดเจนระหว่าง RoR แต่มันขึ้นอยู่กับการใช้งานที่คุณให้modelsเนื่องจากบน Django พวกเขามีตรรกะบางอย่างที่ง่ายในกรอบงานอื่น ๆ จะอยู่ในระดับคอนโทรลเลอร์

viewใน Django มีแนวโน้มที่จะเป็นชุดของคำสั่งสำหรับการเรียกข้อมูลและผ่านไปยังแม่แบบ


10
A viewsใน Django เป็นสิ่งที่เหมือนcontrollerใน MVC และtemplateใน Django มีแนวโน้มมากกว่า aviews
Roel

7

ใน mvt คำขอไปยัง URL จะถูกส่งไปยัง View View นี้เรียกเข้าสู่ Model ดำเนินการปรับแต่งและเตรียมข้อมูลสำหรับเอาต์พุต ข้อมูลจะถูกส่งไปยังเทมเพลตที่แสดงผลเป็นการตอบกลับ ตามหลักการแล้วในเว็บเฟรมเวิร์กตัวควบคุมจะถูกซ่อนจากมุมมอง

นี่คือจุดที่แตกต่างจาก MVC: ใน mvc ผู้ใช้โต้ตอบกับ gui คอนโทรลเลอร์จะจัดการกับคำขอและแจ้งโมเดลและมุมมองจะสอบถามโมเดลเพื่อแสดงผลลัพธ์ให้กับผู้ใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.