Передача данных в шаблоны
Одним из преимуществ шаблонов является то, что мы можем передать в них пользователю различные данные, которые будут динамически подгружены из базы данных через представления views. Для вывода данных в шаблоне могут использоваться различные способы.
Так, вывод самых простых данных может осуществляться с помощью двойной пары фигурных скобок:
{{ название_объекта }}
Например наш шаблон содержит:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Учу Django</title>
</head>
<body>
<h2>{{ header }}</h2>
<p>{{ message }}</p>
</body>
</html>
Как можно видеть, мы ввели здесь две новые переменные: header и message. Эти переменные и будут получать значения из представления view.
Чтобы из функции-представления передать данные в шаблон применяется еще один (третий) параметр в функции render, который называется контекст context. Он представляет из себя словарь, в котором передаются переменные в шаблон. Ключами данного словаря выступают имена переменных, а значениями - значения переменных.
В качестве примера изменим в файле views.py функцию index следующим образом:
from django.shortcuts import render
def index(request):
data = {"header": "Hello Django", "message": "Welcome to Python"}
return render(request, "blog/index.html", context=data)
В нашем шаблоне мы использовали две переменные: header и message, чтобы передать их в шаблон, необходимо создать словарь, в данном случае это data, в котором ключами будут имена переменных header и message, а затем передать данный словарь в качестве параметра context функции render().
В результате при обращении к веб-сайту по адресу http://127.0.0.1:8000 мы увидим следующий вывод в браузере:
Передача в шаблон сложных данных
Ранее мы встроили в шаблон простые текстовые данные. Рассмотрим теперь передачу пользователю через шаблон более сложных данных.
Для этого изменим функцию index в представлении (в файле blog/views.py) следующим образом:
from django.shortcuts import render
def index(request):
header = "Данные пользователя" # обычная переменная
langs = ["Python", "Java", "C#"] # список
user = {"name": "Tom", "age": 23} # словарь
address = ("Абрикосовая", 23, 45) # кортеж
data = {"header": header, "langs": langs, "user": user, "address": address}
return render(request, "blog/index.html", context=data)
В качестве третьего параметра в функцию render нам надо передать словарь, поэтому все данные оборачиваются в словарь и в таком виде передаются в шаблон.
В этом случае шаблон мог бы выглядеть, например, следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Учу Django</title>
</head>
<body>
<h1>{{ header }}</h1>
<p>Имя: {{ user.name }} Возраст: {{ user.age }}</p>
<p>Адрес: ул. {{ address.0 }}, д. {{ address.1 }}, кв. {{ address.2 }}</p>
<p>Языки: {{ langs.0 }}, {{ langs.1 }}</p>
</body>
</html>
Поскольку объекты langs и address представляют, соответственно, список и кортеж, то мы можем обратиться к их элементам через индексы, как мы это делали с ними в любом программном коде на Python.
Но в случае с языком шаблонов Django обращение к индексам, ключам и атрибутам возможно только через точечную нотацию.
Например, первый элемент кортежа адреса address мы можем получить следующим образом: address.0. Соответственно, к элементам списка, содержащего языки langs можно обращать по номеру элемента в списке: langs.0, langs.1.
Поскольку объект с информацией о пользователе user представляет словарь, то аналогичным образом мы можем обратиться к его элементам по ключам словаря name и age следующим образом: user.name, user.age.
В итоге мы получим следующий вывод в веб-браузере:
Если в функции index будет применяться класс TemplateResponse, то в его конструктор также через третий параметр можно передать данные для шаблона.