Передача данных в шаблоны

Последнее обновление: 17.08.2022

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

{{ название_объекта }}

Например, пусть в проекте у нас есть папка 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.

В результате при обращении к корню веб-приложения мы увидим следующий вывод в браузере:

Передача данных в шаблоны Templates в веб-приложении на Django

Передача сложных данных

Рассмотрим передачу более сложных данных. Допустим, в представлении передаются следующие данные:

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}}.

В итоге мы получим следующий вывод в веб-браузере:

Передача списков, кортежей и словарей в шаблон template в Django

TemplateResponse

Если для генерации шаблона применяется класс 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>
Передача объектов классов в шаблон template в Django
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850