首页 > 解决方案 > Jinja2 If 忽略布尔值

问题描述

我有一个 Jinja2 模板,其中一个解析为布尔值 False 的变量在{% if %}语句中被忽略。

模板的相关块看起来像

{% if user.can_manage_techniques %}j
{% block submenu_items %}
<li class="pure-menu-item"><a href={{ url_for('new_technique') }} class="pure-menu-link">New Technique</a></li>
{% endblock %}
{% endif %}

用户在渲染模板中设置为

    return render_template('technique_list.j2',
                            techniques=Technique.find_all(),
                            **state())

state 是一个返回 dict[string, object] 的函数。

传递给它的用户__init__在对象中设置为变量 - 所以:

    def __init__(self):
        self.can_manage_techniques = False

即使can_manage_techniques为 false,列表项仍会呈现. 我如何使{% if %}意识到它是错误的并去{% endif %}

我也尝试== truesameas true

标签: pythonflaskjinja2

解决方案


我无法使用以下最小应用程序在本地重现您的问题:

from flask import Flask, render_template_string
app = Flask(__name__)

@app.route('/')
def hello():
    return render_template_string('''
        {{ can }}
        {% if can %}
            {% block submenu_items %}
                <li class="pure-menu-item">New Technique</li>
            {% endblock %}
        {% endif %}
        ''', can=False)

IMO,用法是正确的,因此您可能需要检查更多相关代码。

在检查了您在 GitHub 上的代码后,我发现了为什么会发生这种情况。模板继承行为导致的这个问题:在子模板中,块外的内容会被跳过

由于您的模板是子模板,因此您需要将 if 语句放入块中。


推荐阅读