Шаблоны (template) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.
Подсистема Django, называется шаблонизатором, загружает шаблон, объединяет его с данными, извлеченными из моделей, полученными от посетителя или сгенерированными в процессе работы, и формирует на основе всего этого полноценный документ, который и отправляется клиенту.
Директивы указывают поместить в заданное место HTML-кода какое-либо значение, теги управляют генерированием содержимого результирующего документа, а фильтры выполняют какие-либо преобразования указанного значения перед выходом.
По умолчанию шаблонизатор ищет все шаблоны в папках «templates», вложенных в папках пакетов приложений. Файлы шаблонов должны иметь расширение html.
Нам надо указать, что этот каталог будет использоваться в качестве хранилища шаблонов. Для этого откроем файл settings.py в папке нашего проекта. В этом файле настройка шаблонов производится с помощью переменной TEMPLATES:
Подсистема 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 со следующим кодом:
Затем в папке «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 и делает её доступной в своём теле.
Познакомимся с директивой шаблонизатора:
На каждом проходе он извлекает из последовательности, хранящейся в переменной bbs, очередной элемент, заносит его в переменную bb и делает её доступной в своём теле.
Познакомимся с директивой шаблонизатора:
{{ bb.title }}
Она указывает извлечь значение из атрибута title объекта, хранящегося в созданной упомянутым ранее тегом переменной bb, и вставить это значение в то место кода, в котором находится она сама.
Фильтр date:
Фильтр date:
<p>{{ bb.published|date:"d.m.Y. H:i:s"}}</p>
Он преобразует значение из атрибута published объекта, хранящегося в переменной bb, т.е. дату и время публикации объявления, в формат, собственно, даты и времени.
Теперь используем нашу страницу «index.html» для отправки ответа пользователю. И для этого перейдем в приложении btest к файлу views.py, который определяет функции для обработки запроса. Изменим этот файл следующим образом:
Теперь используем нашу страницу «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 с запросом к корню веб-приложения:
В файле 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 проверьте работоспособность нашего сайта. Результат будет прежний.