Комментарии (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:
- Это слой представления (V в MVC, но T в MTV)
- Содержит HTML + динамическую логику отображения
- НЕ содержит бизнес-логику (она в View)
- Имеет мощные инструменты: наследование, фильтры, теги
- Работает с контекстом из View
- Легко тестировать и расширять
Template - это ключ к эффективной разработке веб-приложений на Django!