Языки программирования

Создание и использование шаблонов в Django

Шаблоны (template) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.

Подсистема Django, называется шаблонизатором, загружает шаблон, объединяет его с данными, извлеченными из моделей, полученными от посетителя или сгенерированными в процессе работы, и формирует на основе всего этого полноценный документ, который и отправляется клиенту.

Директивы указывают поместить в заданное место HTML-кода какое-либо значение, теги управляют генерированием содержимого результирующего документа, а фильтры выполняют какие-либо преобразования указанного значения перед выходом.

По умолчанию шаблонизатор ищет все шаблоны в папках «templates», вложенных в папках пакетов приложений. Файлы шаблонов должны иметь расширение html.

Нам надо указать, что этот каталог будет использоваться в качестве хранилища шаблонов. Для этого откроем файл settings.py в папке нашего проекта. В этом файле настройка шаблонов производится с помощью переменной TEMPLATES:
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 задает набор каталогов, которые хранят шаблоны. Но по умолчанию он пуст. Теперь изменим данный кусок кода следующим образом:
TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR,],
        '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',
            ],
        },
    },
]
После настроек создадим в папке пакета приложения «btest» папку «templates», а в ней — вложенную папку «btest».

Затем в папке «templates\btest» определим новый файл index.html со следующим кодом:
<!DOCTYPE html>
<html lang="ru">
<head>
	<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
	<title>Главная - Доска объявлений</title>
</head>
<body>
	<h1>Объявления</h1>
	{% for bb in bbs %}
	<div>
		<h2>{{ bb.title }}</h2>
		<p>{{ bb.content }}</p>
		<p>{{ bb.published|date:"d.m.Y. H:i:s"}}</p>
	</div>
	{% endfor %}
</body>
</html>
Теги языка гипертекстовой разметки вы должны изучить самостоятельно, а вот теги шаблонизаторов мы рассмотрим подробнее. Начнем с тега:
{% for bb in bbs %}
...
{% endfor %}
По назначению он аналогичен циклу for…in языка Python.

На каждом проходе он извлекает из последовательности, хранящейся в переменной bbs, очередной элемент, заносит его в переменную bb и делает её доступной в своём теле.

Познакомимся с директивой шаблонизатора:
{{ bb.title }}
Она указывает извлечь значение из атрибута title объекта, хранящегося в созданной упомянутым ранее тегом переменной bb, и вставить это значение в то место кода, в котором находится она сама.

Фильтр date:
<p>{{ bb.published|date:"d.m.Y. H:i:s"}}</p>
Он преобразует значение из атрибута published объекта, хранящегося в переменной bb, т.е. дату и время публикации объявления, в формат, собственно, даты и времени.

Теперь используем нашу страницу «index.html» для отправки ответа пользователю. И для этого перейдем в приложении btest к файлу views.py, который определяет функции для обработки запроса. Изменим этот файл следующим образом:
from .models import Bb
from django.shortcuts import render
 
def index(request):
    bbs = Bb.objects.order_by('-published')
    return render(request, "btest/index.html", {'bbs': bbs})
Функция-сокращение render() из модуля django.shortcuts позволяет выполнить рендеринг шаблона в одном выражении.

В файле urls.py в главном проекте отредактируем сопоставление функции index с запросом к корню веб-приложения:
from django.contrib import admin
from django.urls import path, include
from btest import views

urlpatterns = [
    path('', views.index),
    path('admin/', admin.site.urls),
]
Запустим отладочный web-сервер и проверим наш сайт по ссылке «http://localhost:8000». Результат:

TemplateResponse

Для генерации шаблона мы применяли функцию render(), которая является наиболее распространенным вариантом. Однако также мы можем использовать класс TemplateResponse:
from .models import Bb
from django.template.response import TemplateResponse
 
def index(request):
    bbs = Bb.objects.order_by('-published')
    return TemplateResponse(request,  "btest/index.html", {'bbs': bbs})
После применения класса TemplateResponse проверьте работоспособность нашего сайта. Результат будет прежний.
Фреймворк Django