我希望有一个模板可以有条件地扩展另一个模板。基本上,当一个名为“ajax”的变量为真时,我不希望让模板扩展另一个。
{% if not ajax %}
{% extends "/base.html" %}
{% endif %}
任何线索?
答案 0 :(得分:23)
虽然您可能不会将extends
包装在逻辑块中,因为它必须是第一个标记(如果使用),它仍然可以接受变量,包括过滤器。这应该很适合你的目的:
{% extends ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}
注意:yesno
过滤器也接受空值(None
)作为第三选择,如果您没有指定一个(如本例所示),它将回退以将其转换为{ {1}}(即它将返回第二个选项)。这样,您就可以不在模板中指定False
变量而不会破坏它。
user Rafael建议:
ajax
只有在使用{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}
上下文而不是普通RequestContext
对象并且启用了Context
上下文处理器时,或者如果插入请求对象时,此方法才有效在您的模板上下文中。
答案 1 :(得分:22)
你不能这样做。但是,您可以设置变量并使用它来选择要扩展的模板:
{% extends my_template %}
然后在python代码中你写了类似的东西:
if ajax:
template_values['my_template'] = 'base_ajax.html'
else:
template_values['my_template'] = 'base.html'
您可能希望refer to the documentation获取更多信息。
答案 2 :(得分:5)
我一直在寻找相同问题的解决方案,并且提供了比Klaus Byskov Hoffmann
建议的更好的解决方法。它更好,因为您不必为ajax和非ajax请求提供2个单独的基本模板,更重要的是,您不必定义if语句来定义在EACH控制器中使用哪个基本模板。
在您的情况下,解决方案将是:
<强> page.html中强>
{% extends "/base.html" %}
{% block body %}
hello world
{% endblock body %}
<强> base.html文件强>
{% if not ajax %}
<html>
<head></head>
<body>
LOGO and other stuff...
{% endif %}{% block body %}{% endblock body %}{% if not ajax %}
FOOTER
</body>
</html>
{% endif %}
因此,始终包含base.html,但仅在not ajax
时打印其内容。
更新:这可以通过创建和添加一个新的ConextProcessor来简化,该ConextProcessor将从ajax
填充HttpRequest.is_ajax()
上下文变量,因此您无需在控制器和模板中执行任何额外操作。所有
答案 3 :(得分:0)
如果您不想“扩展”父模板,您始终可以创建一个名为null.html的空文件并对其进行扩展。有点hacky,但很容易理解。
答案 4 :(得分:0)
我知道这是一个老话题,但是如果有人偶然发现了这个话题,我相信达到目标的最佳方法是: “ views.py”
if ajax:
request.session['ajax'] = 'ajax'
“ base.html”
{% if 'ajax' in request.session %}
{% include "ajax.html" %}
{% endif %}
,在“ ajax.html”中,您将不会使用任何{%extended%}或{%block%}标记,因为您不会调用任何内容来将“ ajax.html”扩展到基础上。可以通过“ include”来解决。