详解Django的MVT设计模式
本文深入解析Django框架核心的MVT(Model-View-Template)设计模式。通过对比经典MVC架构,阐明Django中Model、View与Template的具体职责及交互流程。结合完整的代码示例,演示如何创建App、定义模型、编写视图函数及配置模板,帮助开发者理解Django如何处理用户请求并返回响应,掌握Django项目的标准开发流程。
经典的MVC设计模式及其优点
MVC,即Model-View-Controller(模型-视图-控制器),是一种广泛应用的经典软件开发设计模式。
- **Model (模型)**:简而言之,它代表数据模型。需要注意的是,模型并非数据本身(如数据库中的具体记录),而是对数据结构及其逻辑关系的抽象描述。通常,模型定义了数据表的各个字段(例如人的年龄、出生日期等属性)以及它们之间的关系(如一对一、一对多等关联)。Web开发框架通常依据模型的定义来自动生成对应的数据表结构。
- View (视图):主要负责数据的展示,即呈现用户可见的内容或提供用户交互、输入的界面。数据来源通常指向数据库,而用户通过界面输入的数据则会被传递给控制器进行处理。
- Controller (控制器):这是应用程序中处理用户交互逻辑的核心部分。控制器通常负责从视图中读取数据,控制用户的输入行为,并将处理后的数据发送给模型(例如执行增加或更新数据表的操作)。
若将MVC架构比喻为一个粽子,View(视图)相当于最外层的绿色粽叶,是用户直接可见的部分;Controller(控制器)如同中间的熟糯米,负责处理中间逻辑;而Model(模型)则是粽子的核心肉馅,承载最核心的数据内容。这也解释了为何数学建模在中学和大学教育中具有重要地位,因为它培养了抽象逻辑思维能力。
MVC模式最大的优势在于实现了数据、业务逻辑和用户界面的分离。这种分离使得软件或网络应用的开发过程更加清晰,同时也降低了后续维护的难度。这与静态网页设计中通过HTML和CSS实现内容与样式分离的理念是一致的。
Django是如何遵循MVC设计模式的?
Django采用的MVT(Model-View-Template)设计模式由Model(模型)、View(视图)和Template(模板)三个部分组成,分别对应单个App目录下的models.py、views.py以及templates文件夹。虽然表面结构看似与经典MVC不同,但其本质逻辑是相通的。Django的MVT与经典MVC的对应关系如下。
- Django Model (模型):这部分与经典MVC模式中的Model基本一致,负责数据结构和业务逻辑的定义。
- Django View (视图):在Django中,View的功能更接近于MVC中的Controller(控制器)。它不仅负责根据用户请求从数据库读取数据,还决定向用户展示数据的形式(如网页或JSON格式),同时负责渲染模板并处理用户提交的数据。
- Django Template (模板):这部分对应经典MVC模式中的View(视图)。模板用于呈现由Django View传递过来的数据,决定了用户界面的最终外观。模板中还可以包含表单元素,用于收集用户的输入内容。
在Django的MVT设计模式中,View(视图)是最核心的组件,因为它同时与Model(模型)和Template(模板)进行交互。当用户发起一个请求(request)时,Django会解析请求头信息,提取出用户想要访问的URL地址,然后根据urls.py中定义的路由规则,将请求转发到相应的视图函数进行处理。视图函数随后从数据库读取所需数据,指定渲染的模板,并最终返回响应数据。具体流程如下图所示:

示例
接下来,我们将通过一个完整的示例来演示Django中MVT三部分是如何协同工作的。
新建app并注册
假设你有一个名为mysite的项目,现在希望新增一个任务管理的小应用。首先,你需要使用命令`python manage.py startapp tasks`创建一个名为tasks的App,并将其添加到settings.py文件中的INSTALLED_APPS列表中。
# mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tasks',
]
随后,需要将tasks应用的URL配置添加到项目的总urls.py中。
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('tasks/', include('tasks.urls'))
]
创建模型(M)
编辑tasks目录下的models.py文件来创建Task模型。该模型包含name(名称)和status(状态)两个字段。当你执行`python manage.py makemigrations`和`python manage.py migrate`命令时,Django会自动在数据库中创建数据表(默认使用免费的SQLite数据库),表名默认为tasks_task。
# tasks/models.py
from django.db import models
class Status(models.TextChoices):
UNSTARTED = 'u', "Not started yet"
ONGOING = 'o', "Ongoing"
FINISHED = 'f', "Finished"
# Task模型
class Task(models.Model):
name = models.CharField(verbose_name="Task name", max_length=65, unique=True)
status = models.CharField(verbose_name="Task status", max_length=1, choices=Status.choices)
def __str__(self):
return self.name
编写视图并配置路由URL(V)
接下来,我们需要编辑视图文件views.py,并新增一个视图函数task_list,用于展示任务清单。该视图函数从数据库中读取Task对象列表,指定渲染的模板,并向模板传递相关数据。
# tasks/views.py
from django.shortcuts import render
from .models import Task
# 任务清单
def task_list(request):
# 从数据库获取Task对象列表
tasks = Task.objects.all()
# 指定渲染模板并向模板传递数据
return render(request, "tasks/task_list.html", { "tasks": tasks,})
仅仅编写视图(views.py)是不够的,我们还需要为视图函数配置路由,以便将视图函数与用户的请求地址建立对应关系。请编辑或创建tasks/urls.py文件,并添加如下代码:
这样,当用户访问/tasks/路径时,Django将调用task_list视图函数。该视图函数会同时与数据库和模板进行交互,完成数据获取与展示。
编辑模板(T)
最后,我们需要创建task_list.html文件,用于展示视图传递过来的任务列表数据。该文件的完整路径应为tasks/templates/tasks/task_list.html。至于模板为何放置在此处,我们后续会专门介绍。Django提供了自己的模板语言,支持常见的判断和循环语句,专门用于渲染模板内容。
# tasks/templates/tasks/task_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Task List</title>
</head>
<body>
<h3>Task List</h3>
{% for task in tasks %}
<p>{{ forloop.counter }}. {{ task.name }} - {{ task.get_status_display }}
</p>
{% endfor %}
</body>
</html>
此时,如果你通过浏览器访问/tasks/,可能还看不到任何内容,这是因为数据表中尚未存储任何数据。你可以通过Django的Admin后台添加数据,或者新增task_create视图来实现数据的创建。
小结
Django的MVT设计模式同样遵循了软件设计中经典的MVC理念。事实上,在日常的Django项目开发过程中,开发者通常遵循先编写Model(M),再编写View(V),最后编写Template(T)的顺序。
以上就是详解Django的MVT设计模式的详细内容,更多关于Django的MVT设计模式的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









