MVT (Model-View-Template)
定义
MVT 是 Django 框架采用的软件架构模式,是 MVC (Model-View-Controller) 模式的一种变体。
三层架构
┌─────────────────────────────────────┐
│ 用户请求 │
└──────────────┬──────────────────────┘
▼
┌─────────────────────────────────────┐
│ URL 路由 │
│ (匹配请求到对应的视图) │
└──────────────┬──────────────────────┘
▼
┌─────────────────────────────────────┐
│ ┌───────────────────────────────┐ │
│ │ View (视图) │ │
│ │ - 处理 HTTP 请求 │ │
│ │ - 调用 Model 获取数据 │ │
│ │ - 选择 Template 渲染 │ │
│ │ - 返回 HTTP 响应 │ │
│ └──────────────┬────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ Model (模型) │ │
│ │ - 定义数据结构 │ │
│ │ - 数据库交互(ORM) │ │
│ │ - 业务规则/验证 │ │
│ └──────────────┬────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ Template (模板) │ │
│ │ - 页面展示逻辑 │ │
│ │ - HTML 生成 │ │
│ │ - 变量渲染和标签 │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
各层职责
Model (模型)
- 定义数据结构和关系
- 封装数据库操作(通过 ORM)
- 实现业务逻辑和数据验证
- 独立于用户界面
# models.py
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
completed = models.BooleanField(default=False)
def mark_complete(self):
self.completed = True
self.save()
View (视图)
- 接收 HTTP 请求
- 协调 Model 和 Template
- 处理业务逻辑(轻量级)
- 返回 HTTP 响应
# views.py
from django.shortcuts import render
from .models import Task
def task_list(request):
tasks = Task.objects.all()
return render(request, 'tasks/list.html', {'tasks': tasks})
Template (模板)
- 定义用户界面结构
- 使用模板语言渲染动态内容
- 可包含模板继承和包含
<!-- tasks/list.html -->
{% extends 'base.html' %}
{% block content %}
<h1>任务列表</h1>
<ul>
{% for task in tasks %}
<li class="{% if task.completed %}completed{% endif %}">
{{ task.title }}
</li>
{% endfor %}
</ul>
{% endblock %}
MVT vs MVC
| 组件 | MVT | MVC |
|---|---|---|
| Model | 相同 | 相同 |
| View | 处理请求逻辑 | 用户界面 |
| Template | 用户界面 | - |
| Controller | - (由 View 承担) | 处理请求逻辑 |
请求处理流程
1. 用户访问 URL (/tasks/)
↓
2. URLconf 匹配到 task_list 视图
↓
3. View 调用 Model 查询数据
↓
4. Model 返回数据对象
↓
5. View 选择 Template 并传递数据
↓
6. Template 渲染生成 HTML
↓
7. View 返回 HTTP Response
↓
8. 用户看到页面
最佳实践
- 薄视图,厚模型:业务逻辑放在模型中
- 视图只负责 HTTP:请求处理、响应返回
- 模板只负责展示:不处理复杂逻辑
- 模型独立:不依赖视图或模板
相关概念
- MVC - Model-View-Controller 模式
- Django - 采用 MVT 的 Web 框架
- ORM - 对象关系映射
录入自: Django开发实践笔记