Когда мы создаём сайты на Django, нам часто нужно не просто вернуть текст пользователю, а отобразить полноценную HTML-страницу: с заголовками, картинками, списками фильмов или сериалов. Для этого Django использует шаблоны (templates) — это обычные HTML-файлы, в которые можно вставлять данные из Python-кода.
Можно сказать, что шаблон — это “каркас страницы”, в который Django подставляет нужную информацию. Например, на странице списка фильмов мы можем заранее задать структуру таблицы или карточек, а потом просто заполнить их названиями, постерами и рейтингами из базы данных.
Если сравнить с другими технологиями:
- в Flask шаблоны работают через Jinja2;
- в PHP часто используются вставки
<?= ?>; - а в Django используется собственный шаблонизатор, который позволяет писать конструкции вроде
{{ movie.title }}прямо в HTML.
По умолчанию шаблоны размещаются в папке templates внутри каждого приложения.
Для нашего проекта cinemahub структура будет выглядеть так:
cinemahub/
│── movies/
│ ├── templates/
│ │ ├── movies/
│ │ │ ├── index.html
│ │ │ ├── about.html
💡 Почему мы создаём папку с именем приложения (
movies) внутриtemplates?Потому что в проекте может быть несколько приложений (например,
users,reviews,movies), и у всех могут быть своиindex.html. Чтобы Django не запутался, мы храним шаблоны в подпапках, совпадающих с именем приложения.
Создадим наш первый шаблон — главную страницу проекта cinemahub.
Файл: movies/templates/movies/index.html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>CinemaHub — Главная страница</title>
</head>
<body>
<h1>Добро пожаловать в CinemaHub!</h1>
<p>Здесь вы найдете лучшие фильмы и сериалы со всего мира.</p>
</body>
</html>Теперь создадим функцию во views.py, которая будет возвращать этот шаблон в браузер.
Функция render_to_string() загружает шаблон, обрабатывает его и возвращает HTML-код в виде строки.
Это удобно, если вы хотите, например, отправить сгенерированный HTML по почте или сохранить в файл.
from django.http import HttpResponse
from django.template.loader import render_to_string
def index(request):
html_code = render_to_string('movies/index.html')
return HttpResponse(html_code)Если вы теперь запустите сервер (python manage.py runserver)
и откроете в браузере страницу http://127.0.0.1:8000/, вы увидите вашу первую страницу с приветствием.
На практике чаще используется функция render().
Она объединяет загрузку шаблона и формирование HTTP-ответа в одну строку кода:
from django.shortcuts import render
def index(request):
return render(request, 'movies/index.html')Это более короткий и удобный способ рендеринга шаблонов, и именно его вы будете использовать в большинстве случаев.
Информация о шаблонах хранится в файле settings.py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]Обрати внимание на два параметра:
DIRS— можно указать дополнительные пути к шаблонам (например, если они лежат вне приложения).APP_DIRS=True— Django будет искать шаблоны в каждой папкеtemplatesвнутри установленных приложений.
Если вы по ошибке установите APP_DIRS=False, Django просто не найдёт шаблон и выведет ошибку TemplateDoesNotExist.
-
Запусти сервер:
python manage.py runserver -
Открой в браузере:
http://127.0.0.1:8000/ -
Убедись, что страница отображает заголовок “Добро пожаловать в CinemaHub!” и текст под ним.
-
Попробуй изменить текст в
index.htmlи обнови страницу — ты увидишь изменения сразу. Django автоматически обновляет шаблоны без перезапуска сервера.
Шаблоны — это сердце любого сайта на Django, где нужно отображать динамические данные:
- страницы фильмов или сериалов (CinemaHub),
- карточки товаров в интернет-магазине,
- профили пользователей,
- списки статей или новостей.
Позже мы научимся передавать данные из базы в шаблон и выводить, например, постеры фильмов, их описание и рейтинг. А пока — важно понять сам принцип: шаблон = HTML-структура страницы.
- Создай в проекте приложение
movies, если оно ещё не создано. - Добавь папку
templates/movies/. - Создай шаблон
index.htmlс произвольным содержимым (например, приветствие и описание сайта). - Настрой маршрут
/на отображение этой страницы. - Проверь в браузере, что всё работает.
- Попробуй изменить HTML и увидеть обновления без перезапуска сервера.
- В отдельной вьюшке по адресу
/about/создай страницу “О проекте CinemaHub”.
- Что такое шаблон в Django и зачем он нужен?
- В какой папке рекомендуется хранить шаблоны приложения?
- Для чего нужна функция
render_to_string()? - Чем отличается
render()отrender_to_string()? - Что делает параметр
APP_DIRSв настройкахTEMPLATES? - Что произойдёт, если удалить
templates/movies/или указать неверное имя файла? - Как проверить, что шаблон корректно подключен?
- Почему лучше использовать
render()вместоHttpResponseпри работе с HTML-шаблонами? - Какие ошибки чаще всего возникают при неправильном подключении шаблонов?
- Как ты думаешь, можно ли использовать шаблоны не только для HTML, но и, например, для писем?