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

Что такое 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 паттерна

  1. Разделение ответственности: Model, View, Template — разные файлы
  2. Переиспользование: одну модель может использовать несколько view
  3. Тестирование: легко тестировать model и view отдельно
  4. Масштабируемость: структура понятна при росте проекта
  5. Производительность: кеширование, оптимизация запросов

Практический пример: создание блога

# 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 → TemplateModel → Controller → View
ViewОбработка логики (как контроллер)Представление HTML
ControllerВстроен в ViewОтдельный компонент
ИспользованиеDjango, Jinja2Rails, Laravel, Spring
СложностьПроще для небольших проектовБолее модульен для больших

Вывод

MVT — архитектурный паттерн Django, который:

  • Разделяет приложение на три слоя (Model, View, Template)
  • Model отвечает за данные
  • View за логику и подготовку данных
  • Template за HTML представление
  • Облегчает разработку и тестирование веб-приложений
  • Стандарт де-факто для Django разработчиков