我有一个Jinja2模板,其中在{% if %}
语句中忽略了一个解析为布尔False的变量。
模板的相关块看起来像
{% 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())
状态是返回dict [string,object]的函数。
传递给它的用户在对象的__init__
中设置为变量-因此:
def __init__(self):
self.can_manage_techniques = False
即使can_manage_techniques
为false,列表项仍会呈现。如何使{% if %}
意识到它是错误的,然后转到{% endif %}
?
我也尝试过== true
和sameas true
答案 0 :(得分:2)
我无法使用以下最少的应用程序在本地重现您的问题:
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语句放入块中。
答案 1 :(得分:0)
我相信这可能是您定义True
和False
的方式,在python中这些应该是布尔类型(您可以使用type(test)
进行测试)。这些不应该是字符串或其他东西。它总是返回true的原因可能是因为非空字符串的计算结果为true(例如Bool('false')
为True
,而Bool('')
为False
)。
from jinja2 import Template
template = Template(
"""{% if test %}
{% block submenu_items %}
My Stuff
{% endblock %}
{% endif %}
""")
如果我执行以下任一操作,都会得到预期的结果:
template.render(test=False)
template.render(test=True)
答案 2 :(得分:0)
如果{% if %}
语句在块之外-将被忽略。如果它在块内,则成功。我不知道为什么-但这就是解决方法:
{% 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 %