← Назад к вопросам
Что такое MVT паттерн в Python?
3.0 Senior🔥 161 комментариев
#DevOps и инфраструктура
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое MVT паттерн в Python?
MVT (Model-View-Template) — это архитектурный паттерн веб-приложений, используемый в Django (веб-фреймворк для Python). Это вариация классического паттерна MVC (Model-View-Controller) с некоторыми отличиями в терминологии и подходе.
Различие между MVC и MVT
MVC (привычный паттерн):
- Model — данные и бизнес-логика
- View — представление (то, что видит пользователь)
- Controller — обработка запросов и управление логикой
MVT (паттерн Django):
- Model — данные и бизнес-логика
- View — обработка логики и подготовка данных (логика контроллера из MVC)
- Template — представление HTML (то, что видит пользователь)
Структура MVT в Django
HTTP Запрос от пользователя
↓
URL Router (urls.py)
↓
View (views.py) — обработка логики
↓
Model (models.py) — работа с БД
↓
Template (templates/) — генерация HTML
↓
HTTP Ответ с HTML
1. Model (Модель)
Model — определяет структуру данных и работает с базой данных:
# models.py
from django.db import models
from django.utils import timezone
class Blog(models.Model):
"""
Модель блога с полями и методами для работы с данными
"""
title = models.CharField(max_length=200)
content = models.TextField()
author = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title
def publish(self):
"""Метод для публикации блога"""
self.is_published = True
self.save()
2. View (Представление логики)
View — обрабатывает HTTP запрос, работает с моделью и подготавливает данные для шаблона:
# views.py
from django.shortcuts import render, get_object_or_404
from django.views import View
from .models import Blog
class BlogListView(View):
"""Представление для отображения списка блогов"""
def get(self, request):
# Получить все опубликованные блоги
blogs = Blog.objects.filter(is_published=True).order_by('-created_at')
# Передать данные в шаблон
context = {
'blogs': blogs,
'total_count': blogs.count(),
}
return render(request, 'blog_list.html', context)
class BlogDetailView(View):
"""Представление для отображения одного блога"""
def get(self, request, blog_id):
blog = get_object_or_404(Blog, id=blog_id)
return render(request, 'blog_detail.html', {'blog': blog})
# Альтернатива: использовать класс-based views
from django.views.generic import ListView, DetailView
class BlogListViewCBV(ListView):
model = Blog
template_name = 'blog_list.html'
context_object_name = 'blogs'
paginate_by = 10
def get_queryset(self):
return Blog.objects.filter(is_published=True)
3. Template (Шаблон)
Template — HTML файл с переменными и логикой для отображения данных:
<!-- templates/blog_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>Блоги</title>
</head>
<body>
<h1>Все блоги ({{ total_count }})</h1>
{% if blogs %}
<ul>
{% for blog in blogs %}
<li>
<h2>{{ blog.title }}</h2>
<p>Автор: {{ blog.author }}</p>
<p>Дата: {{ blog.created_at|date:"d.m.Y" }}</p>
<p>{{ blog.content|truncatewords:50 }}</p>
<a href="/blog/{{ blog.id }}/">Читать далее</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>Блогов не найдено</p>
{% endif %}
</body>
</html>
4. URL Router
urls.py — маршрутизирует URL на соответствующие views:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('blogs/', views.BlogListView.as_view(), name='blog_list'),
path('blogs/<int:blog_id>/', views.BlogDetailView.as_view(), name='blog_detail'),
]
Полный цикл MVT
# 1. Пользователь переходит по URL: /blogs/
# 2. Django маршрутизирует на BlogListView
# 3. View получает queryset из Model (blogs = Blog.objects.filter(...))
# 4. View создаёт контекст с данными
# 5. Django рендирит Template с данными из контекста
# 6. HTML отправляется в браузер
Преимущества MVT паттерна
- Разделение ответственности: Model, View, Template — разные файлы
- Переиспользование: одну модель может использовать несколько view
- Тестирование: легко тестировать model и view отдельно
- Масштабируемость: структура понятна при росте проекта
- Производительность: кеширование, оптимизация запросов
Практический пример: создание блога
# models.py
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# views.py
from django.shortcuts import render
from .models import Post
from django.db.models import Q
def blog_search(request):
query = request.GET.get('q', '')
posts = Post.objects.all()
if query:
# Фильтруем посты по заголовку или контенту
posts = posts.filter(
Q(title__icontains=query) | Q(content__icontains=query)
)
context = {
'posts': posts,
'query': query,
}
return render(request, 'blog_search.html', context)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('search/', views.blog_search, name='blog_search'),
]
MVT vs MVC
| Аспект | MVT (Django) | MVC |
|---|---|---|
| Структура | Model → View → Template | Model → Controller → View |
| View | Обработка логики (как контроллер) | Представление HTML |
| Controller | Встроен в View | Отдельный компонент |
| Использование | Django, Jinja2 | Rails, Laravel, Spring |
| Сложность | Проще для небольших проектов | Более модульен для больших |
Вывод
MVT — архитектурный паттерн Django, который:
- Разделяет приложение на три слоя (Model, View, Template)
- Model отвечает за данные
- View за логику и подготовку данных
- Template за HTML представление
- Облегчает разработку и тестирование веб-приложений
- Стандарт де-факто для Django разработчиков