← Назад к вопросам

Что такое MTV в Django?

2.0 Middle🔥 191 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

MTV в Django: паттерн архитектуры

MTV (Model-Template-View) — это архитектурный паттерн, используемый в Django для разделения ответственности между различными компонентами приложения. Это вариант известного паттерна MVC (Model-View-Controller) с собственной терминологией Django.

Компоненты MTV

1. Model (Модель)

Модель представляет структуру данных и бизнес-логику. Это Python-класс, который определяет таблицу в базе данных.

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey('User', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    is_published = models.BooleanField(default=False)
    
    class Meta:
        ordering = ['-created_at']
    
    def __str__(self):
        return self.title
    
    def get_summary(self):
        return self.content[:100]

Джанго автоматически создаёт таблицу в БД на основе этого определения.

2. Template (Шаблон)

Шаблон — это HTML с встроенным Python кодом, который отвечает за представление данных пользователю.

<!-- posts/post_list.html -->
{% extends "base.html" %}

{% block content %}
<div class="posts">
    {% for post in posts %}
    <article class="post">
        <h2>{{ post.title }}</h2>
        <p class="meta">Автор: {{ post.author }} | {{ post.created_at|date:"d.m.Y" }}</p>
        <p>{{ post.get_summary }}...</p>
        {% if post.is_published %}
        <a href="{% url 'post_detail' post.pk %}">Читать далее</a>
        {% endif %}
    </article>
    {% empty %}
    <p>Нет опубликованных постов.</p>
    {% endfor %}
</div>
{% endblock %}

Шаблоны используют теги ({% %}) и переменные ({{ }}) для вывода данных.

3. View (Представление)

Вью — это бизнес-логика, которая:

  • Обрабатывает запрос от клиента
  • Работает с моделями (получает/сохраняет данные)
  • Передаёт данные в шаблон
  • Возвращает ответ
from django.shortcuts import render, get_object_or_404
from django.views import View
from django.views.generic import ListView, DetailView
from .models import Post

# Функциональное представление (Function-Based View)
def post_list(request):
    posts = Post.objects.filter(is_published=True).order_by('-created_at')
    return render(request, 'posts/post_list.html', {'posts': posts})

# Классовое представление (Class-Based View)
class PostListView(ListView):
    model = Post
    template_name = 'posts/post_list.html'
    context_object_name = 'posts'
    paginate_by = 10
    
    def get_queryset(self):
        return Post.objects.filter(is_published=True)

class PostDetailView(DetailView):
    model = Post
    template_name = 'posts/post_detail.html'
    context_object_name = 'post'

Взаимодействие компонентов MTV

1. Пользователь отправляет запрос
        ↓
2. Django маршрутизирует запрос (urls.py)
        ↓
3. View обрабатывает запрос
        ↓
4. View работает с Model (получает/сохраняет данные из БД)
        ↓
5. View передаёт данные в Template
        ↓
6. Template рендерит HTML с данными
        ↓
7. Ответ возвращается пользователю

Пример полного цикла

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('posts/', views.PostListView.as_view(), name='post_list'),
    path('posts/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
]

views.py:

from django.views.generic import ListAPIView
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'author', 'created_at']

class PostListView(ListAPIView):
    queryset = Post.objects.filter(is_published=True)
    serializer_class = PostSerializer

template (posts/post_detail.html):

<!DOCTYPE html>
<html>
<head>
    <title>{{ post.title }}</title>
</head>
<body>
    <article>
        <h1>{{ post.title }}</h1>
        <p>Автор: {{ post.author }}</p>
        <p>{{ post.content }}</p>
        <footer>
            <time datetime="{{ post.created_at|date:'c' }}">{{ post.created_at|date:'d.m.Y H:i' }}</time>
        </footer>
    </article>
</body>
</html>

MTV vs MVC

MTV (Django)MVCНазначение
ModelModelДанные и логика
TemplateViewПредставление, UI
ViewControllerБизнес-логика, управление потоком

Джанго использует название View для компонента, который в классическом MVC называется Controller.

Преимущества MTV паттерна

  1. Разделение ответственности — каждый компонент делает одно
  2. Переиспользуемость — модели и вью можно переиспользовать
  3. Тестируемость — легко писать тесты для каждого компонента
  4. Масштабируемость — просто добавлять новые модели и вью
  5. Понятность — ясная структура проекта

МТВ паттерн — это основа архитектуры Django, обеспечивающая чистоту и организованность кода.

Что такое MTV в Django? | PrepBro