首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jinja2如果忽略布尔值

Jinja2如果忽略布尔值
EN

Stack Overflow用户
提问于 2019-03-22 09:07:12
回答 3查看 10.9K关注 0票数 0

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

模板的相关块如下所示

代码语言:javascript
复制
{% 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 %}

用户在呈现模板中设置为

代码语言:javascript
复制
    return render_template('technique_list.j2',
                            techniques=Technique.find_all(),
                            **state())

状态是一个返回命令字符串对象的函数。

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

代码语言:javascript
复制
    def __init__(self):
        self.can_manage_techniques = False

即使在can_manage_techniques 为false时,列表项仍然呈现。如何使{% if %}认识到它是假的,然后转到{% endif %}

我也尝试过== truesameas true

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-23 00:06:48

我不能用下面最小的应用程序在本地重现你的问题:

代码语言:javascript
复制
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)

海事组织,使用是正确的,所以你可能需要检查更多的相关代码。

在检查了GitHub上的代码之后,我找到了发生这种情况的原因。此问题由模板继承行为引起:在子模板中,块外的内容将被跳过

因为模板是子模板,所以需要将if语句放入块中。

票数 3
EN

Stack Overflow用户

发布于 2019-03-23 02:45:57

如果{% if %}语句在块之外,则忽略它。如果它在块内,则成功。我不知道为什么-但这是解决办法:

代码语言:javascript
复制
{% block submenu_items %}
{% if user.can_manage_techniques == true %}
<li class="pure-menu-item"><a href={{ url_for('new_technique') }} class="pure-menu-link">New Technique</a></li>
{% endif %}
{% endblock %
票数 2
EN

Stack Overflow用户

发布于 2019-03-22 10:04:31

我相信这可能是定义TrueFalse的方式,在python中这些应该是布尔类型(您可以使用type(test)进行测试)。这些不应该是字符串或其他东西。它总是返回true的原因可能是因为非空字符串的计算结果为true (例如,Bool('false')True,而Bool('')False)。

代码语言:javascript
复制
from jinja2 import Template

template = Template(
    """{% if test %}
{% block submenu_items %}
My Stuff
{% endblock %}
{% endif %}
""")

如果运行以下任一项,就会得到预期的结果:

代码语言:javascript
复制
template.render(test=False)
template.render(test=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55296164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档