Python/Django - 如果模板中的语句扩展

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)

您可能希望参考文档以获取更多信息.


Vla*_*kov 5

我正在寻找相同问题的解决方案,并提供了比建议更好的解决方法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(),因此您根本无需在控制器和模板中执行任何额外操作.

  • 是的,这是一个解决方案; 但是,我相信通过模板文件分离任务比将一切包装在一个巨人中更清楚如果...... (2认同)