Одним из преимуществ шаблонов является то, что мы можем передать в них динамически из представлений различные данные. Для вывода данных в шаблоне могут использоваться различные способы. Для вывода самых простых данных применяется двойная пара фигурных скобок:
{{ название_объекта }}
Например, пусть в проекте у нас есть папка 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>