Подтвердить что ты не робот

Многоуровневый шаблон Django расширяет и вложенные блоки

Скажем, у меня есть три файла шаблона html, показанные ниже. HTML минимален, чтобы проиллюстрировать эту точку.

Возможно ли каким-то образом вставить блок с именем extra_head_content внутри блока, уже названного extra_head_content. Идея состоит в том, чтобы позволить шаблону третьего уровня предоставить блок с именем extra_head_content. Шаблон над ним принимает этот контент, добавляет его в свой блок с именем extra_head_content и предоставляет этот объединенный блок его родительскому шаблону.

По сути, я ищу блокировку блоков через наследуемые файлы шаблонов.

Точный сценарий, который я пытаюсь решить, заключается в том, что любой шаблон должен иметь возможность добавлять дополнительные файлы javascript или css в элемент head. Однако, самый низкий шаблон не должен заботиться о том, сколько уровней вниз он вложен. Аналогично, дополнительное содержимое заголовка, предоставляемое промежуточным шаблоном, не должно быть перезаписано блочным элементом шаблона терминала.

base.html

<html>
<head>
    <link rel="stylesheet" type="text/css" href="/static/css/reset.css" />
    {% block extra_head_content %}{% endblock %}
</head>
<body>{% block content %}{% endblock %}
</html>

account.html

{% extends "base.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
    {% block extra_head_content  %}{% endblock %}
{% endblock %}

{% block content %}
    <div id="menu">...</div>
    {% block account_content %}{% endblock %}
{% endblock %}

account_profile.html

{% extends "account.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" />
{% endblock %}

{% block account_content %}
    Welcome to your profile
{% endblock %}
4b9b3361

Ответ 1

Нет, но вы можете использовать {{ block.super }}:

{% block extra_head_content  %}
    {{ block.super }}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% endblock %}

Ответ 2

Модуль django-sekizai позволяет с легкостью добавлять к css и javascript:

#base.html
{% load sekizai_tags %}
# define your template, declaring blocks for inheriting templates:
{% block content %}
{% endblock content %}
# at the bottom of the body:
{% render_block "js" %}
</body>
</html>

#my_template.html
{% extends "base.html" %}
{% load sekizai_tags %}
{% block content %}
# content goes here...
# so does the addtoblock tag
    {% addtoblock "js" %}
        <script src="my/awesome/script.js"></script>
    {% endaddtoblock %}
{% endblock content %}
# Note no addtoblock tags outside the block-endblock tags

sekazai docs разъясняют оговорки об использовании этой системы, а именно:

  • render_block следует использовать только вне тегов блока
  • render_block не может использоваться в включенных шаблонах
  • addtoblock следует использовать внутри тегов блока при использовании в включенном шаблоне