模板中的Python/Django-If语句

2024-03-28 13:55:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

有线索吗?


Tags: 模板baseifhtmlnotajax条件endif
3条回答

虽然不能将extends包装在逻辑块中,但如果使用它,它必须是第一个标记,因此仍然可以接受变量,包括筛选器。这应该很符合你的目的:

{% extends ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}

注意:yesno过滤器也接受空值(None)作为第三个选项,如果您不指定一个(在本例中),它将回退到将其转换为False(即,它将返回第二个选项)。这允许您在模板中不指定ajax变量而不破坏它。


建议由user Rafael

{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %}
{# stuff #}

只有在使用RequestContext上下文而不是普通的Context对象并且启用了request上下文处理器时,或者在模板上下文中插入请求对象时,这才有效。

我在寻找同一问题的解决方案,并且找到了比Klaus Byskov Hoffmann建议的更好的解决方法。这更好,因为您不必为ajax和非ajax请求拥有两个独立的基本模板,而且更重要的是,您不必定义if语句,该语句将定义在每个控制器中使用哪个基本模板。

在您的情况下,解决方案是:

页面.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将从HttpRequest.is_ajax()中填充ajax上下文变量,因此您根本不必在控制器和模板中执行任何额外的操作。

你不能那样做。但是,您可以设置一个变量并使用该变量选择要扩展的模板:

{% extends my_template %}

然后在python代码中编写如下内容:

if ajax:
    template_values['my_template'] = 'base_ajax.html'
else:
    template_values['my_template'] = 'base.html'

您可能希望refer to the documentation了解更多信息。

相关问题 更多 >