Когда мы только начали работать с Django, страницы нашего сайта были статичными — то есть каждый HTML-файл выглядел одинаково для всех пользователей. Но настоящие сайты так не работают: на главной странице показываются новинки фильмов, на странице фильма — его описание, на странице актёра — список ролей. Все эти данные нужно как-то передавать из Python-кода (представления) в HTML-шаблон, чтобы шаблон мог «подставить» нужную информацию.
Механизм довольно простой и универсальный:
- В файле views.py мы подготавливаем данные, например — заголовок страницы или список фильмов.
- Передаём эти данные в функцию
render(), которая объединяет их с HTML-шаблоном. - Django заменяет специальные конструкции в шаблоне (например
{{ title }}) на реальные значения.
Проще говоря: views.py → формирует данные templates → отображает их в HTML.
Начнём с самого простого примера — одной переменной.
В файле views.py нашего приложения movies создадим функцию index():
from django.shortcuts import render
def index(request):
data = {'title': 'Главная страница CinemaHub'}
return render(request, 'movies/index.html', data)Мы создали словарь data, в котором указали одно поле title.
Затем передали его в шаблон index.html.
Файл templates/movies/index.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>Добро пожаловать в проект CinemaHub!</p>
</body>
</html>В фигурных скобках {{ title }} мы вставляем переменную из контекста.
Django подставит значение 'Главная страница CinemaHub'.
-
Запусти сервер командой:
python manage.py runserver
-
Открой в браузере страницу
http://127.0.0.1:8000/.
Если всё сделано правильно, на странице появится заголовок: Главная страница CinemaHub
Теперь попробуем передать сразу несколько значений: текст, список, словарь и даже объект.
class Movie:
def __init__(self, title, year):
self.title = title
self.year = year
def index(request):
data = {
'title': 'Главная страница CinemaHub',
'subtitle': 'Каталог фильмов и сериалов',
'genres': ['Драма', 'Комедия', 'Фантастика'],
'ratings': {'Interstellar': 9.0, 'Oppenheimer': 8.8},
'movie': Movie('Inception', 2010),
}
return render(request, 'movies/index.html', data)Файл templates/movies/index.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<h2>{{ subtitle }}</h2>
<h3>Жанры:</h3>
<p>{{ genres }}</p>
<h3>Рейтинги:</h3>
<p>{{ ratings }}</p>
<h3>Объект Movie:</h3>
<p>{{ movie }}</p>
</body>
</html>Если обновить страницу, Django подставит в шаблон значения всех переменных. Обрати внимание: списки, словари и объекты отобразятся как текст, потому что мы их просто вывели «как есть».
Шаблоны Django позволяют обращаться к элементам коллекций (словари, списки) и к атрибутам объектов через точку.
<p>Первый жанр: {{ genres.0 }}</p>
<p>Рейтинг фильма Interstellar: {{ ratings.Interstellar }}</p>
<p>Название фильма: {{ movie.title }}</p>
<p>Год выпуска: {{ movie.year }}</p>Теперь шаблон подставит конкретные значения:
{{ genres.0 }}→Драма{{ movie.title }}→Inception
Когда Django рендерит шаблон, он проходит по всем {{ ... }} и ищет соответствие в переданном контексте.
Если переменной нет — Django просто выведет пустую строку.
То есть {{ something }} не вызовет ошибку, но и не покажет ничего на экране.
Попробуй изменить словарь ratings, добавь туда свой любимый фильм и рейтинг.
Затем выведи его в шаблоне.
Например:
'ratings': {'Interstellar': 9.0, 'Oppenheimer': 8.8, 'The Dark Knight': 9.1}В Django-шаблонах прямое обращение через точку, как {{ ratings.The Dark Knight }}, не сработает, потому что шаблонизатор воспринимает точку как обращение к атрибуту или ключу без пробелов:
<p>Рейтинг The Dark Knight: {{ ratings.The Dark Knight }}</p>Вызовет ошибку!
Если ты видишь пустое место вместо значения переменной, проверь:
- Совпадает ли имя переменной в шаблоне и в словаре контекста.
- Правильно ли ты передал
context=dataвrender(). - Не забыл ли перезапустить сервер после изменений.
Теперь ты знаешь:
- как передавать данные из представлений в шаблоны;
- как обращаться к элементам списков, словарей и атрибутам объектов;
- как Django динамически формирует содержимое страницы.
Это фундамент: на нём строится всё — от простых сайтов до крупных веб-приложений.
- Зачем нужны переменные в шаблонах Django?
- Что делает функция
render()? - Как в шаблоне обратиться к атрибуту объекта Python?
- Что произойдёт, если в шаблоне указать переменную, которой нет в контексте?
- Как обратиться к первому элементу списка
genresв шаблоне? - Можно ли вывести словарь напрямую в шаблон?
- Какой тип данных передаётся в шаблон из представления?
- Почему важно соблюдать имена переменных при передаче данных?
- Как в шаблоне обратиться к ключу словаря
ratings.Interstellar? - Что нужно сделать, если после обновления шаблон не показывает новые данные?