python - 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 %}
?
我也尝试== true
过sameas true
解决方案
我无法使用以下最小应用程序在本地重现您的问题:
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 语句放入块中。
推荐阅读
- python - 大熊猫插值后剩余的 NaN
- c - 如何修复插入链表的错误。从文件流
- rust - Rust 如何处理将 &SizedType 转换为 &UnsizedType?
- google-apps-script - 如何更正此脚本以不在特定日期运行触发器
- linux - 如何在shell脚本中的if else语句中将输出写入文件
- python-3.x - 将新列添加到数据框中,其中新列是另一列与条件匹配的组的最小日期值
- docker - Docker ENTRYPOINT 变量未结转到 CMD
- java - 导入 net.minecraftforge.fml.common.Mod;错误
- cql - cassandra 中 EXISTS 的替代方案是什么?
- python-3.x - 如何创建具有不同变量向量元素的 SOC 约束