Django vs. Model View Controller [đã đóng]


110

Ai đó có thể giải thích cho tôi sự khác nhau giữa Django và mẫu Model View Controller không?

Về mặt chức năng, chúng ta có thể mong đợi điều gì từ những khác biệt đó - tức là những gì hoạt động khác biệt so với Django, chẳng hạn như Ruby on Rails?


2
Khi bạn nói “Bộ điều khiển Chế độ xem Mô hình”, bạn có nghĩa là mô hình chung hay một cách triển khai cụ thể (như Ruby on Rails)?
Paul D. Waite

33
Câu hỏi này không đủ điều kiện là 'không mang tính xây dựng' và có câu trả lời thẳng thắn mà không cần "tranh luận, tranh luận, thăm dò ý kiến ​​hoặc thảo luận mở rộng". Tại sao đóng nó sau đó?
người dùng

6
không mang tính xây dựng? SO siêu mod lại tấn công.
Amit Tripathi

4
Tính đến ngày hôm nay, gần 24.000 người nhận thấy câu hỏi này có tính xây dựng. Bao gồm bản thân tôi.
Frojim

3
Tính đến năm 2017, câu hỏi này vẫn còn mang tính xây dựng
Leonardo Pessoa

Câu trả lời:


140

Theo Sách Django , Django tuân theo mô hình MVC đủ chặt chẽ để được gọi là khung MVC.

Django đã được gọi là một khuôn khổ MTV vì bộ điều khiển được xử lý bởi chính khuôn khổ và hầu hết sự phấn khích xảy ra trong các mô hình, khuôn mẫu và chế độ xem.

Bạn có thể đọc thêm về MTV / MVC tại đây:

Mô hình phát triển MTV (hoặc MVC)

Nếu bạn đã quen thuộc với các khuôn khổ phát triển Web MVC khác, chẳng hạn như Ruby on Rails, bạn có thể coi các khung nhìn Django là bộ điều khiển và các mẫu Django là các khung nhìn .

Đây là một sự nhầm lẫn đáng tiếc do cách hiểu khác nhau về MVC.

Theo diễn giải của Django về MVC, chế độ xem mô tả dữ liệu được trình bày cho người dùng; không nhất thiết chỉ là dữ liệu trông như thế nào, mà là dữ liệu nào được trình bày.

Ngược lại, Ruby on Rails và các khuôn khổ tương tự gợi ý rằng công việc của bộ điều khiển bao gồm việc quyết định dữ liệu nào được trình bày cho người dùng, trong khi chế độ xem hoàn toàn là dữ liệu trông như thế nào chứ không phải dữ liệu nào được trình bày.


6
Cảm ơn vì câu trả lời tuyệt vời. Từ Rails đến Django, câu này trả lời một trong những điều tôi thấy bực bội nhất: tại sao django lại đặt mã bộ điều khiển trong một tệp có tên views.py !?
dgmdan

@dgmdan Đó chỉ là quy ước mặc định, bạn có thể chọn tên mình thích. Nhưng tôi đồng ý, nó có vẻ :) lạ
Paolo Moretti

1
Tôi muốn để views.py làm lớp xem và tạo một tập hợp các lớp bộ điều khiển thành một gói bộ điều khiển để tránh sự nhầm lẫn của Django.
stanleyxu2005

5
@dgmda: Làm cho khái niệm "bộ điều khiển" là một từ viết sai trong các ứng dụng web. MVC là một khung hướng sự kiện không chỉ phù hợp với mô hình YÊU CẦU / RESPONSE không trạng thái của HTTP. Nó không nên được gọi là MVC ngay từ đầu. Hầu hết tất cả các ứng dụng web không phải là MVC, nhưng sử dụng một mô hình và một hàm hoặc lớp thường được gọi là Chế độ xem. Đến lượt mình, Chế độ xem có thể ủy quyền hiển thị HTML cho Mẫu, nhưng không cần. Vì vậy, không có một bộ điều khiển, thực sự.
Lennart Regebro

2
Tôi trở lại khái niệm Lennart Regebro rằng một mô hình không quốc tịch như HTTP không nên có một bộ điều khiển và mô hình MVC cho webapps chỉ mang về sự nhầm lẫn lớn
Hussam

23

Bản thân Câu hỏi thường gặp về Django là một nơi tốt để bắt đầu:

Theo cách hiểu của chúng tôi về MVC, “chế độ xem” mô tả dữ liệu được hiển thị cho người dùng. Không nhất thiết là dữ liệu trông như thế nào mà là dữ liệu nào được trình bày. Chế độ xem mô tả dữ liệu nào bạn thấy, không phải cách bạn nhìn thấy dữ liệu đó. Đó là một sự khác biệt tinh tế.

...

Hơn nữa, thật hợp lý khi tách nội dung khỏi bản trình bày - đó là nơi xuất hiện các mẫu. Trong Django, “chế độ xem” mô tả dữ liệu nào được trình bày, nhưng chế độ xem thường ủy quyền cho một mẫu, mô tả cách dữ liệu được trình bày.

Vậy thì "bộ điều khiển" phù hợp ở đâu? Trong trường hợp của Django, có lẽ đó là chính khung: máy gửi yêu cầu đến chế độ xem thích hợp, theo cấu hình URL Django.

Nếu bạn khao khát các từ viết tắt, bạn có thể nói rằng Django là một khuôn khổ “MTV” - nghĩa là “mô hình”, “khuôn mẫu” và “chế độ xem”. Sự đổ vỡ đó có ý nghĩa hơn nhiều.

Hãy nhớ rằng “Bộ điều khiển Chế độ xem Mô hình” chỉ là một mẫu, tức là một nỗ lực để mô tả một kiến ​​trúc chung. Vì vậy, một câu hỏi hay hơn có thể là "Django phù hợp với mẫu Model View Controller đến mức nào?"


3
Đây có lẽ là câu trả lời trực tiếp nhất.
người dùng

11

Khi bạn viết mã, không nghĩ đến tên của các phần khung, không có sự khác biệt đáng ngờ nào, ví dụ như RoR. Nhưng nó phụ thuộc vào cách bạn sử dụng models, vì trên Django, chúng dễ dàng chứa một số logic mà trên các khung công tác khác sẽ ở mức bộ điều khiển.

Trên viewDjango có xu hướng là một tập hợp các truy vấn để tìm nạp dữ liệu và chuyển chúng vào mẫu.


10
Một viewstrong Django là một cái gì đó giống như một controllertrong MVC và một templatetrong Django có nhiều khả năng mộtviews
Roel

7

Trong mvt, một yêu cầu đến một URL được gửi đến một Chế độ xem. View này gọi vào Model, thực hiện các thao tác và chuẩn bị dữ liệu cho đầu ra. Dữ liệu được chuyển đến một Mẫu được trả về một phản hồi được phát ra. lý tưởng nhất là trong các khuôn khổ web, bộ điều khiển được ẩn khỏi chế độ xem.

Đây là điểm khác biệt so với MVC: trong mvc, người dùng tương tác với gui, bộ điều khiển xử lý yêu cầu và thông báo cho mô hình và chế độ xem truy vấn mô hình để hiển thị kết quả cho người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.