Django 5 для начинающих

Прогресс по курсу:  9/1004

2.6 Шаблоны, часть 1.
5 из 13 шагов пройдено
0 из 36 баллов  получено

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

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


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Было бы здорово хотя бы пару строк добавить на тему того, почему к элементам списка langs = ["Python", "Java", "C#"] в шаблоне нельзя обращаться через квадратные langs[0] :)

@Полина_Пелеева, Добавили пару строк.) А нельзя обращаться потому, что Django использует свой язык шаблонов, который отличается от языка Python.

Объясните пожалуйста по синтаксису, как правильно ставятся пробелы, а то где-то с дух сторон стоят, где-то с одной, а где-то вообще их нет. Это опечатки или можно как угодно их ставить/не ставить?

@Максим_Михеев, можно как угодно ставить, на работоспособность не влияет, но лучше с пробелом.
Тут исправил, спасибо.