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

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

2.0 Middle🔥 131 комментариев
#Python Core

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

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

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

Template в MTV (Django): Слой представления

Template - это третий компонент архитектуры MTV (Model-Template-View) Django. Это HTML-файлы с встроенной логикой шаблонизации для динамического отображения данных.

MTV архитектура Django

Django использует архитектуру MTV, которая похожа на MVC, но с иными названиями:

  • Model - модель БД (SQLAlchemy equivalent)
  • Template - представление (V в MVC)
  • View - контроллер (C в MVC)
[Request] → View (процесс) → Model (данные) → Template (отображение) → [Response]

Что такое Template

Template - это текстовый файл (обычно HTML), который:

  • Содержит статическое содержимое (HTML)
  • Содержит динамические переменные из контекста
  • Содержит логику циклов, условий и фильтры
  • НЕ содержит бизнес-логику (она в View и Model)

Структура Template

<!-- templates/article.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ article.title }}</title>
</head>
<body>
    <h1>{{ article.title }}</h1>
    <p>Автор: {{ article.author.name }}</p>
    <p>{{ article.content }}</p>
    
    <!-- Условие -->
    {% if article.published %}
        <span>Опубликовано: {{ article.published_date }}</span>
    {% else %}
        <span>Черновик</span>
    {% endif %}
    
    <!-- Цикл -->
    <h3>Комментарии:</h3>
    <ul>
    {% for comment in article.comments.all %}
        <li>{{ comment.author }}: {{ comment.text }}</li>
    {% empty %}
        <li>Комментариев нет</li>
    {% endfor %}
    </ul>
</body>
</html>

View и Template: взаимодействие

# views.py
from django.shortcuts import render
from .models import Article

def article_detail(request, article_id):
    # Model: получить данные из БД
    article = Article.objects.get(id=article_id)
    
    # View: подготовить контекст
    context = {
        'article': article,
        'title': article.title,
        'related_articles': Article.objects.filter(category=article.category)[:5]
    }
    
    # Template: отрендерить HTML с контекстом
    return render(request, 'article.html', context)

Контекст - это словарь с переменными, которые будут доступны в Template.

Синтаксис Template

Переменные

<!-- Простая переменная -->
<p>{{ user.name }}</p>

<!-- Атрибут объекта -->
<p>{{ user.profile.bio }}</p>

<!-- Элемент списка -->
<p>{{ items.0 }}</p>

<!-- С фильтром -->
<p>{{ article.title|upper }}</p>  <!-- ARTICLE TITLE -->
<p>{{ article.created_at|date:"d.m.Y" }}</p>  <!-- 23.03.2026 -->

Условия

{% if user.is_authenticated %}
    <p>Добро пожаловать, {{ user.name }}!</p>
{% elif user.is_anonymous %}
    <p>Пожалуйста, авторизуйтесь</p>
{% else %}
    <p>Неизвестный статус</p>
{% endif %}

Циклы

<!-- Простой цикл -->
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}

<!-- С условием -->
{% for item in items %}
    {% if item.visible %}
        <li>{{ item.name }}</li>
    {% endif %}
{% endfor %}

<!-- Empty блок -->
{% for item in items %}
    <li>{{ item }}</li>
{% empty %}
    <p>Нет элементов</p>
{% endfor %}

<!-- Переменные цикла -->
{% for item in items %}
    {{ forloop.counter }}. {{ item }}  <!-- 1. item, 2. item ... -->
    {% if forloop.first %}<strong>{% endif %}
    {% if forloop.last %}</strong>{% endif %}
{% endfor %}

Встроенные фильтры

<!-- Строки -->
{{ text|lower }}              <!-- в нижний регистр -->
{{ text|upper }}              <!-- в ВЕРХНИЙ РЕГИСТР -->
{{ text|title }}              <!-- В Заголовок -->
{{ text|truncatewords:10 }}   <!-- Первые 10 слов... -->
{{ text|slugify }}            <!-- slugified-text -->

<!-- Числа -->
{{ value|add:5 }}             <!-- value + 5 -->
{{ items|length }}            <!-- Количество элементов -->
{{ 3.14159|floatformat:2 }}   <!-- 3.14 -->

<!-- Даты -->
{{ date|date:"Y-m-d" }}       <!-- 2026-03-23 -->
{{ date|time:"H:i" }}          <!-- 14:30 -->

-- Другие --
{{ value|default:"No value" }}  <!-- Если value пуст -->
{{ items|join:", " }}            <!-- Объединить: item1, item2, item3 -->
{{ value|urlencode }}            <!-- Для использования в URL -->

Template Tags: управление логикой

<!-- URL -->
<a href="{% url 'article_detail' article.id %}">Читать</a>
<!-- Преобразуется в: <a href="/articles/5/">Читать</a> -->

<!-- CSRF защита -->
<form method="POST">
    {% csrf_token %}
    <input type="submit" value="Отправить">
</form>

<!-- Include других templates -->
{% include "header.html" %}

<!-- Extend базового шаблона -->
<!-- child.html -->
{% extends "base.html" %}
{% block content %}
    <p>Это контент дочернего шаблона</p>
{% endblock %}

<!-- Комментарии -->
{# Это комментарий в template #}
{% comment %}
    Это многострочный
    комментарий
{% endcomment %}

Наследование Template (Template Inheritance)

Это самая мощная функция Django Template.

<!-- templates/base.html (базовый шаблон) -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <header>{% include "header.html" %}</header>
    
    <main>
        {% block content %}
            Default content
        {% endblock %}
    </main>
    
    <footer>{% include "footer.html" %}</footer>
</body>
</html>
<!-- templates/article.html (наследует base.html) -->
{% extends "base.html" %}

{% block title %}
    {{ article.title }} - My Site
{% endblock %}

{% block content %}
    <article>
        <h1>{{ article.title }}</h1>
        <p>{{ article.content }}</p>
    </article>
{% endblock %}

Custom Template Tags и Filters

Можешь создавать свои теги и фильтры:

# templatetags/custom_filters.py
from django import template

register = template.Library()

@register.filter
def pluralize_ru(value, endings='ОК,А,ОВ'):
    """Русское множественное число"""
    endings = endings.split(',')
    if value % 10 == 1 and value % 100 != 11:
        return endings[0]
    elif value % 10 in (2, 3, 4) and value % 100 not in (12, 13, 14):
        return endings[1]
    else:
        return endings[2]

@register.tag
def lorem(parser, token):
    """Кастомный тег"""
    return "Lorem ipsum dolor sit amet"
<!-- Использование в template -->
{% load custom_filters %}

<p>У вас {{ comments_count }} коммента{{ comments_count|pluralize_ru:"рий,рия,риев" }}</p>

Лучшие практики Template

<!-- ПЛОХО: логика в template -->
{% if user.groups.all|length > 0 and user.is_active and user.profile.verified %}
    <!-- Сложно читать -->
{% endif %}

<!-- ХОРОШО: логика в view -->
{% if user.is_active_verified %}
    <!-- Просто и понятно -->
{% endif %}
# views.py
def user_view(request):
    user = User.objects.get(id=1)
    
    # Вся логика в Python
    user.is_active_verified = (
        user.is_active and 
        user.profile.verified and 
        user.groups.exists()
    )
    
    return render(request, 'template.html', {'user': user})

Отличие Template от другого?

View → Template  vs  View → JSON API

-- Template (для HTML) --
Верните полностью отрендеренный HTML
Нужны: наследование, циклы, условия в HTML

-- JSON API --
Верните данные в формате JSON
Фронтенд обработает сам (React, Vue)

Итоговая архитектура

[HTTP Request] 
    ↓
[Django URLs] → path('articles/<int:id>/', views.article_detail)
    ↓
[View] → article_detail(request, id)
    ↓
[Model] → Article.objects.get(id=id)
    ↓
[Template] → render(request, 'article.html', context)
    ↓
[HTTP Response] ← Полностью отрендеренный HTML

Вывод

Template в Django:

  1. Это слой представления (V в MVC, но T в MTV)
  2. Содержит HTML + динамическую логику отображения
  3. НЕ содержит бизнес-логику (она в View)
  4. Имеет мощные инструменты: наследование, фильтры, теги
  5. Работает с контекстом из View
  6. Легко тестировать и расширять

Template - это ключ к эффективной разработке веб-приложений на Django!