Вложенные шаблоны Django - PullRequest
8 голосов
/ 06 мая 2011

Это кажется довольно простым делом, но, хотя я использую Django около года, я никогда не сталкивался с этим сценарием.

Во многих шаблонных / веб-фреймворках,Наследование шаблонов работает немного по-другому, так как обычно оно ведет себя больше как обертки, так что если у вас есть childtemplate.html, parenttemplate.html и grandparenttemplate.html, то окончательный рендеринг обычно выглядит примерно так:* Это не совсем так, как это работает в Django, но мне интересно, как это реализовать.

В частности, у меня есть мой "дочерний" шаблон, скажем так, foo.html.foo.html по желанию получает переменную parent_template или по умолчанию "base.html"

{% extends parent_template|default:"base.html" %}

{% block content %}
I am a foo and my title is {{ foo.title }}
{% endblock content %}

Итак, вот где я наткнулся на загадку.Если parent_template является шаблоном, этот шаблон должен обернуть содержимое foo.html, а затем поместить результат в base.html:

{% extends "base.html" %}

{% something_magical_here %}
<div>parent header</div>
# content of foo.html
<div>parent footer</div>
{% end_something_magical_here %}

И затем в base.html:

<html>
... snip ...
<div id="content">
{% something_else_magical %}
# content of parent_template rendering, or just foo.html if no parent_template given
{% end_something_else_magical %}

Что должно отображаться как

<html>
... snip ...
<div id="content">
<div>parent header</div> 
I am a foo and my title is Bar
<div>parent footer</div>

, если установлен parent_template, и

<html>
... snip ...
<div id="content">
I am a foo and my title is Bar

, если это не так.

Надеюсь, моя проблема ясна: мне нужно(необязательно) обернуть шаблон в родительский шаблон, а затем отправить результаты этого в шаблон base.html.

Обычно что-то вроде этого может работать:

#foo.html
{% extends "parent.html" %}
{% block child_content %}
I am a foo and my title is {{ foo.title }}
{% endblock child_content %}

#parent.html
{% extends "base.html" %}

{% block content %}
parent header
{% block child_content %}{% endblock child_content %}
parent content
parent footer

#base.html
base header
{% block content %}{% endblock content %}
base content
base footer

Однако, поскольку parent_template может быть пустым, иногда base.html будет получать только блок child_content, а не content block.

Кроме того, я хотел бы иметь возможность сделать это без создания группы подблоков (что, если я решу, что приложение foo должно иметь свое собственное /foo/base.htmlчто тогда вызывает /base.html)?

Есть идеи?

1 Ответ

11 голосов
/ 06 мая 2011

тег шаблона extends может принимать переменный аргумент.

так:

base.html
    {% block content %}
        <p>BASE</p>
    {% endblock %}

parent.html
    {% extends "base.html" %}

    {% block content %}
        {{ block.super }}
        <p>PARENT</p>
    {% endblock %}

foo.html
    {% extends ext_templ %}

    {% block content %}
        {{ block.super }}
        <p>FOO</p>
    {% endblock %}

с использованием базы:

return render_to_response('foo.html', {'ext_templ':'base.html'})

дает вам:

<p>BASE</p>
<p>FOO</p>

используя родителя:

return render_to_response('foo.html', {'ext_templ':'parent.html'})

дает вам:

<p>BASE</p>
<p>PARENT</p>
<p>FOO</p>

редактирование:

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

base.html
    {% block content %}
        {% block top %}
            <p>BASE START</p>
        {% endblock %}

        {% block bot %}
            <p>BASE END</p>
        {% endblock %}
    {% endblock %}


parent.html
    {% extends "base.html" %}

    {% block top %}
        {{ block.super }}
        <p>PARENT</p>
    {% endblock %}

    {% block bot %}
        <p>PARENT</p>
        {{ block.super }}
    {% endblock %}

foo.html
    {% extends ext_templ %}

    {% block top %}
        {{ block.super }}
        <p>FOO</p>
    {% endblock %}

    {% block bot %}
        <p>FOO END</p>
        {{ block.super }}
    {% endblock %}

Другой метод, который я могу придумать, - обернуть блоки тегом {% if ext_templ == 'parent.html' %}, но это не выглядит очень сухо. Мне любопытно увидеть реакцию других людей на вложенные блоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...