Это кажется довольно простым делом, но, хотя я использую 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
)?
Есть идеи?