Вложенные шаблоны и фильтр include

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

Фильтр include позволяет добавить в один шаблон другой шаблон. Название подключаемого шаблона передается фильтру в качестве параметра:

{% include подключаемый_файл  %}

Допустим, в приложении у нас имеются два шаблона: index.html и banner.html

include и вложенные шаблоны в Django

Пусть в файле banner.html будет какой-нибудь простейший код:

<div>Руководство по Django на METANIT.COM</div>

В другом файле - index.html подключим данный шаблон:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
<h2>Главная страница</h2>
{% include "banner.html"  %}
</body>
</html>

В итоге при обращении к шаблону index.html на веб-странице появится содержимое из подключенного шаблона banner.html

include и вложенные шаблоны в Django

Стоит отметить, что вместо жесткой установки пути к вложенному шаблону в виде строки, можно использовать переменные:

{% include template_name %}

В данном случае предполагается, что template_name - это переменная, которая хранит путь к вложенному шаблону.

Передача данных

Во вложенные шаблоны также можно передавать некоторые данные. Например, изменим код в banner.html следующим образом:

<div>Руководство по {{ tutorial }} на {{ site}}</div>

Здесь используются переменные tutorial и site. Теперь изменим код index.html, передав для этих переменныъ некоторые данные:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
<h2>Главная страница</h2>
{% include "banner.html" with tutorial="Python" site="METANIT.COM"  %}
</body>
</html>

Для передачи данных для фильтра определяются две переменных: tutorial и site. Объявление переменных идет после оператора with.

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

Передача данных из родительского шаблона

Вложенные шаблоны автоматически подхватывают данные их родительских шаблонов. Например, возьмем выше определенный шаблон banner.html:

<div>Руководство по {{ tutorial }} на {{ site}}</div>

В файле views.py определим следующую функцию-представление:

from django.shortcuts import render
 
def index(request):
    return render(request, "index.html", context={"site":"METANIT.COM"})

Здесь в шаблон index.html передается элемент site. Теперь изменим код index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
<h2>Главная страница</h2>
{% include "banner.html" with tutorial="Python" %}
</body>
</html>

Теперь для шаблона banner.html НЕ создается переменная site, потому что вложенный шаблон автоматически получить данные по ключу "site" из родительского шаблона index.html. Однако это поведение не всегда удобно. Мы можем запретить автоматическую передачу данных из родительского во вложенный шаблон, используя оператор only:

{% include "banner.html" with tutorial="Python" only %}

В этом случае шаблон banner.html не получит данные по ключу "site"

include и передача данных во вложенные шаблоны из представлений в Django
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850