Django 的 MTV 架構與 startapp 指令全面解析
更新日期: 2024 年 12 月 1 日
本文為 Django 新手教學,第 6 篇:
Django 是一個基於 MTV 架構設計的 Web 框架,它簡化了 Web 開發的流程,使開發者能高效地構建功能強大的應用。
在本文中,我們將探討 Django 的 MTV 架構與經典的 MVC 模式的異同,並說明如何通過 startapp
指令快速創建 MTV 模式應用。
什麼是 MVC 與 MTV?
MVC(Model-View-Controller)是一種經典的設計模式,強調將應用程序的數據邏輯(Model)、業務邏輯(Controller)和展示邏輯(View)分離。
Django 基於 MVC 模式進行了一些調整,形成了自己的 MTV 架構。
MVC 架構
- Model:負責數據邏輯和數據庫交互,定義應用的數據結構和業務邏輯。
- View:負責數據的渲染與顯示,例如生成 HTML。
- Controller:處理用戶請求,調用 Model,將數據傳遞給 View。
MTV 架構
Django 的 MTV 模式在命名和職責劃分上稍有不同:
- Model:與 MVC 中的 Model 相同,負責定義數據結構和處理業務邏輯,使用 Django 的 ORM 簡化數據庫操作。
- Template:負責渲染 HTML,專注於數據的顯示,取代了 MVC 中的 View。
- View:處理用戶請求和業務邏輯,對應於 MVC 的 Controller。
MVC 與 MTV 對應關係
MVC | Django MTV | 功能 |
---|---|---|
Model | Model | 定義數據結構,處理數據庫交互。 |
View | Template | 負責數據渲染,生成用戶界面。 |
Controller | View | 處理用戶請求,調用 Model 和 Template。 |
為什麼 Django 採用 MTV 架構?
- 簡化角色分工:
Django 將界面生成的責任(如 HTML 渲染)從 View 分離,放入 Template 中,開發者能更直觀地進行前後端協作。 - 清晰的責任劃分:
- View:專注於處理業務邏輯,返回數據響應。
- Template:專注於界面設計,負責數據展示。
- 快速開發:
MTV 模式專為 Web 開發設計,適合 Django 的快速開發理念。
startapp
指令與 MTV 的關係
startapp
是 Django 用於創建新應用的命令,它與 MTV 架構緊密相關,為每個應用提供了 MTV 所需的基本組件。
startapp
指令的作用
執行以下指令可以創建一個新的應用骨架:
python manage.py startapp <app_name>
創建後的目錄結構如下:
myproject/
├── manage.py
├── myproject/
│ ├── settings.py
│ ├── urls.py
│ ├── ...
├── <app_name>/ # 使用 startapp 創建的應用
├── migrations/ # 管理數據庫遷移
├── admin.py # 註冊管理後台
├── apps.py # 配置應用
├── models.py # 定義 Model
├── tests.py # 測試代碼
├── views.py # 定義 View
├── __init__.py
startapp
與 MTV 的對應
- Model(models.py)
負責數據結構的定義,例如數據表和邏輯操作:- 定義數據模型後,執行
makemigrations
和migrate
,將模型同步到數據庫。
- 定義數據模型後,執行
- View(views.py)
負責處理用戶請求、調用模型、返回響應:- 可使用函數視圖(FBV)或類型視圖(CBV)來實現。
- Template
雖然模板文件並未由startapp
自動生成,但開發者可以在應用中創建templates/<app_name>/
資料夾,用於存放 HTML 模板。
使用 startapp
創建 MTV 架構應用
以下是通過 startapp
創建 MTV 應用的步驟。
創建應用並註冊
使用以下指令創建應用:
python manage.py startapp blog
將應用註冊到 settings.py
的 INSTALLED_APPS
中:
INSTALLED_APPS = [
...,
'blog',
]
定義模型(Model)
在 blog/models.py
中定義數據結構:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
同步數據庫:
python manage.py makemigrations
python manage.py migrate
實現視圖(View)
在 blog/views.py
中定義視圖函數:
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts})
配置路由(URL 配置)
在應用中創建 blog/urls.py
:
from django.urls import path
from .views import post_list
urlpatterns = [
path('', post_list, name='post_list'),
]
在主應用的 urls.py
中引入:
from django.urls import path, include
urlpatterns = [
path('blog/', include('blog.urls')),
]
設置模板(Template)
在應用內創建模板目錄 templates/blog/
,並添加模板文件 post_list.html
:
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
</head>
<body>
<h1>Blog Posts</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }} - {{ post.created_at }}</li>
{% endfor %}
</ul>
</body>
</html>
小結
Django 的 MTV 架構與 startapp
指令為開發者提供了一個清晰、高效的開發範式:
- MTV 架構 將數據處理(Model)、業務邏輯(View)和數據渲染(Template)分離,適合快速開發 Web 應用。
startapp
指令 幫助我們快速創建應用的骨架,提供 MTV 所需的基本組件。
通過 MTV 架構和 startapp
指令,Django 能幫助開發者高效地構建結構清晰、功能強大的應用!