什麼是 MTV?
Django 遵循一個類似於 MVC (Model-View-Controller) 的設計模式,但它對組件的命名略有不同,因此被稱為 MTV。
-
M - Model (模型): 模型是資料的來源。它負責處理應用程式的資料邏輯,並與資料庫進行互動。在 Django 中,每個模型都是一個 Python 類別,這個類別定義了資料庫表格的結構,例如欄位(fields)和它們的類型。你不需要寫任何 SQL 語句,Django 的 ORM (物件關聯對映) 會自動將你的 Python 程式碼轉換為資料庫指令。
- 例子:一個
Blog模型可能包含title(標題)、content(內容)和pub_date(發布日期)等欄位。
- 例子:一個
-
T - Template (模板): 模板是呈現資料的工具。它是一個 HTML 檔案,其中可以包含特殊的 Django 語法,用於顯示從視圖傳來的資料。模板的作用是將資料與網頁的呈現邏輯分離,讓設計師和程式設計師可以分工合作。
- 例子:一個用來顯示部落格文章的 HTML 頁面,其中包含
和等變數,用來顯示特定文章的標題和內容。
- 例子:一個用來顯示部落格文章的 HTML 頁面,其中包含
-
V - View (視圖): 視圖是處理請求的函數。它負責接收使用者發出的請求,從模型中取得資料,然後將這些資料傳遞給模板,最後返回一個完整的網頁給使用者。
- 例子:一個名為
show_post的視圖函數,它會從資料庫中取得一篇 ID 為 1 的文章,然後將這篇文章的資料傳送給模板。
- 例子:一個名為
Django 的請求處理流程
讓我們用一個部落格網站的例子,來理解一個請求如何從開始到結束,經過 MTV 的每一個組件:
-
使用者發出請求:使用者在瀏覽器中輸入
http://127.0.0.1:8000/blog/post/1/。 -
urls.py接收請求:Django 的 URL 路由系統(位於myproject/urls.py)會檢查這個 URL,並找到對應的視圖 (View) 函數,例如blog.views.show_post。 views.py處理請求:show_post視圖函數被執行。- 它會根據 URL 中的
1這個 ID,去模型 (Model) 裡查詢資料庫,找到 ID 為 1 的那篇文章。
- 它會根據 URL 中的
-
models.py取得資料:模型 (Model) 層會將查詢轉換為 SQL 語句,然後從資料庫中取得文章的標題、內容等資料。 -
視圖傳送資料:視圖函數從模型層拿到資料後,會將這些資料傳送給模板 (Template)。
-
template渲染頁面:模板 (Template) 會接收視圖傳來的資料,並根據 HTML 結構將資料填入對應的變數位置,產生一個完整的 HTML 頁面。 -
視圖返回回應:視圖函數將最終渲染好的 HTML 頁面作為回應,返回給使用者的瀏覽器。
- 使用者看到網頁:瀏覽器收到 HTML 內容,並將其顯示出來。
MVC 是 Model-View-Controller 的縮寫,它是一種將軟體應用程式分成三個獨立但互相協作的部分的設計模式。這種模式在開發網頁應用程式時非常常見,特別是在使用各種框架(如 Django、Rails、Laravel 等)時。
MVC 架構的核心概念
你可以將 MVC 想像成一個餐廳的運作模式:
- M - Model(模型):
- 角色:廚房的食材和廚師。
- 功能:負責處理應用程式的資料和商業邏輯。它與資料庫互動,處理資料的存取、儲存和驗證。Model 不關心資料如何顯示給使用者。
- 例子:一個使用者帳戶的 Model 可能包含姓名、電子郵件、密碼等資料,以及註冊、登入、更改密碼等處理邏輯。
- V - View(視圖):
- 角色:餐廳的菜單和用餐區。
- 功能:負責將資料呈現給使用者。它只負責顯示,不處理任何商業邏輯。
- 例子:一個網頁上的 HTML 模板,用來顯示使用者個人資料、部落格文章列表或購物車內容。
- C - Controller(控制器):
- 角色:餐廳的服務生。
- 功能:協調 Model 和 View。它接收使用者的請求,決定要使用哪個 Model 來處理資料,並將處理後的資料傳給哪個 View 來顯示。Controller 是使用者與應用程式之間的橋樑。
- 例子:一個控制器可能接收到「顯示部落格文章」的請求,它會指示 Model 去資料庫中取得文章資料,然後將這些資料傳給 View,由 View 負責將文章內容渲染成網頁。
Django 的 MTV 與 MVC
你可能會注意到,在之前的 Django 教學中,我們提到了 MTV,也就是 Model-Template-View。這與 MVC 幾乎是相同的概念,只是命名略有不同:
- Django 的 M (Model) ↔ MVC 的 M (Model)
- 功能相同:處理資料和商業邏輯。
- Django 的 T (Template) ↔ MVC 的 V (View)
- 功能相同:負責資料的呈現。
- Django 的 V (View) ↔ MVC 的 C (Controller)
- 功能相同:接收請求,並協調 Model 和 Template(View)。在 Django 中,這個「協調」的角色就是由 View 來擔任的。
為什麼要使用 MVC/MTV?
這種模式的主要優點是將關注點分離 (Separation of Concerns)。它讓程式碼更有組織、更易於維護和測試。
- 易於維護:當你想修改網頁介面時,你只需要修改 View(或 Template),而不需要動到處理資料的 Model。
- 可重複使用:Model 可以被不同的 Controller 使用,View 也可以被不同的 Controller 渲染。
- 易於測試:你可以單獨測試每個組件,例如,測試 Model 的資料邏輯是否正確,而不需要啟動整個網頁。
總之,MVC 是一種廣泛使用的軟體設計模式,它讓複雜的應用程式變得更有條理,也更利於團隊協作。