Gre*_*L83 23 python django django-templates
我想有一个模板,有条件地延伸另一个.基本上,当一个名为"ajax"的变量为真时,我不希望让模板扩展另一个.
{% if not ajax %}
{% extends "/base.html" %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
有线索吗?
sle*_*anc 24
虽然您可能不会包装extends
逻辑块,但由于它必须是第一个标记(如果使用),它仍然可以接受变量,包括过滤器.这应该很适合你的目的:
{% extends ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}
Run Code Online (Sandbox Code Playgroud)
注意:yesno
过滤器也接受空值(None
)作为第三选择,如果你没有指定一个(如本例所示),它将回退到将其转换为False
(即它将返回第二个选择).这允许您ajax
在不破坏模板的情况下不在模板中指定变量.
用户Rafael建议:
{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}
Run Code Online (Sandbox Code Playgroud)
只有在使用RequestContext
上下文而不是普通Context
对象并且request
启用了上下文处理器时,或者在模板上下文中插入请求对象时,这才有效.
Kla*_*sen 22
你不能这样做.但是,您可以设置变量并使用它来选择要扩展的模板:
{% extends my_template %}
Run Code Online (Sandbox Code Playgroud)
然后在python代码中你写了类似的东西:
if ajax:
template_values['my_template'] = 'base_ajax.html'
else:
template_values['my_template'] = 'base.html'
Run Code Online (Sandbox Code Playgroud)
您可能希望参考文档以获取更多信息.
我正在寻找相同问题的解决方案,并提供了比建议更好的解决方法Klaus Byskov Hoffmann
.它更好,因为您不必为ajax和非ajax请求提供2个单独的基本模板,更重要的是,您不必定义if语句来定义在EACH控制器中使用哪个基本模板.
在您的情况下,解决方案将是:
page.html中
{% extends "/base.html" %}
{% block body %}
hello world
{% endblock body %}
Run Code Online (Sandbox Code Playgroud)
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 %}
Run Code Online (Sandbox Code Playgroud)
因此,始终包含base.html,但它仅在以下时打印其内容not ajax
.
更新:这可以通过创建和添加一个新的ConextProcessor来简化,该ConextProcessor将填充ajax
上下文变量HttpRequest.is_ajax()
,因此您根本无需在控制器和模板中执行任何额外操作.
归档时间: |
|
查看次数: |
8630 次 |
最近记录: |