Одним из преимуществ шаблонов является то, что мы можем передать в них динамически из представлений различные данные. Для вывода данных в шаблоне могут использоваться различные способы. Для вывода самых простых данных применяется двойная пара фигурных скобок:
{{ название_объекта }}
Например, пусть в проекте у нас есть папка templates, в которой содержится шаблон index.html:
Определим в файле index.html следующий код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django на METANIT.COM</title>
</head>
<body>
<h2>{{ header }}</h2>
<p>{{ message }}</p>
</body>
</html>
Здесь используется две переменных: message и header. Они будут передаваться из представления.
Чтобы из функции-представления передать данные в шаблон применяется третий параметр функции render, который еще называется context и который представляет словарь. Например, изменим файл views.py следующим образом:
from django.shortcuts import render
def index(request):
data = {"header": "Hello Django", "message": "Welcome to Python"}
return render(request, "index.html", context=data)
В шаблоне используются две переменных, соответственно словарь, который передается в функцию render через параметр context, теперь содержит два значения с ключами header и message.
В результате при обращении к корню веб-приложения мы увидим следующий вывод в браузере:
Рассмотрим передачу более сложных данных. Допустим, в представлении передаются следующие данные:
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, "index.html", context=data)
В качестве третьего параметра в функцию render нам надо передать словарь, поэтому все данные оборачиваются в словарь и в таком виде передаются в шаблон.
В этом случае шаблон мог бы выглядеть, например, следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django на METANIT.COM</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, например, первый элемент кортежа address: address.0.
Подобным образом, поскольку объект user представляет словарь, то мы можем обратиться к его элементам по ключам name и age: {{ user.name}} {{user.age}}.
В итоге мы получим следующий вывод в веб-браузере:
Если для генерации шаблона применяется класс TemplateResponse, то в его конструктор также через третий параметр можно передать данные для шаблона:
from django.template.response import TemplateResponse
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 TemplateResponse(request, "index.html", data)
Подобным образом можно передавать в шаблоны объекты своих классов. Например, определение функции-представления:
from django.shortcuts import render
def index(request):
return render(request, "index.html", context = {"person": Person("Tom")})
class Person:
def __init__(self, name):
self.name = name # имя человека
Здесь определяется класс Person, в конструкторе которого передается некоторое значение для атрибута name. В функции index в шаблон передается объект с ключом "person".
В шаблоне index.html мы можем обращаться к функциональности объекта, например, к его атрибуту name:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django на METANIT.COM</title>
</head>
<body>
<h1>Person {{ person.name }}</h1>
</body>
</html>