Многоуровневый шаблон Django расширяет и вкладывает блоки - PullRequest
26 голосов
/ 03 января 2012

Допустим, у меня есть три файла шаблона 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 %}

Ответы [ 2 ]

52 голосов
/ 03 января 2012

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

{% block extra_head_content  %}
    {{ block.super }}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% endblock %}
2 голосов
/ 28 декабря 2014

Модуль 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 дают четкие указания для использования этогосистема, а именно:

  1. render_block следует использовать только вне тегов блока
  2. render_block нельзя использовать во включенных шаблонах
  3. addtoblock следует использовать внутри тегов блока при использованииво включенном шаблоне
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...