详解Django的MVT设计模式

七月
七月
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析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设计模式的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表