【发布时间】:2011-08-20 10:21:52
【问题描述】:
这似乎是一件非常基本的事情,但尽管我已经使用 Django 大约一年了,但我从未遇到过这种情况。
在很多模板/网络框架中,模板继承的工作方式有点不同,因为它通常表现得更像包装器,所以如果你有 childtemplate.html、parenttemplate.html 和 grandparenttemplate.html,那么最终渲染通常看起来像:
grandparent header
parent header
child header
child content
parent content
parent footer
grandparent content
grandparent footer
这并不是它在 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 块。
另外,我希望能够做到这一点而不必创建一堆子块(如果我决定 foo 应用程序应该有自己的 /foo/base.html 然后调用 /base.html 怎么办) ?
有什么想法吗?
【问题讨论】:
标签: python django django-templates nested