LoongLee's blog

MVT

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. 用户看到页面

最佳实践

  1. 薄视图,厚模型:业务逻辑放在模型中
  2. 视图只负责 HTTP:请求处理、响应返回
  3. 模板只负责展示:不处理复杂逻辑
  4. 模型独立:不依赖视图或模板

相关概念

  • MVC - Model-View-Controller 模式
  • Django - 采用 MVT 的 Web 框架
  • ORM - 对象关系映射

录入自: Django开发实践笔记