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

时间:2011-02-18 15:27:18

标签: python django django-templates

我希望有一个模板可以有条件地扩展另一个模板。基本上,当一个名为“ajax”的变量为真时,我不希望让模板扩展另一个。

{% if not ajax %}
    {% extends "/base.html" %}
{% endif %}

任何线索?

5 个答案:

答案 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”来解决。