我阅读了文档,我不清楚这是否正确。我知道你可以使用嵌套for循环,但if语句似乎不同。
我可以执行以下操作吗?
{% if thing=true %}
<div> something here</div>
{% if diffthing=true %}
<div> something else</div>
{% else %}
<div> third thing</div>
{% endif %}
{% else %}
<div> nothing here </div>
{% endif %}
或者格式应该以某种方式不同?
答案 0 :(得分:10)
Jinja2支持嵌套块,包括if语句和其他控制结构。
请参阅Block Nesting and Scope上的文档:“可以嵌套块以获得更复杂的布局。”
一个很好的用例就是编写有条件输出HTML的宏:
{# A macro that generates a list of errors coming back from wtforms's validate function #}
{% macro form_error_summary(form, li_class='bg-danger') %}
{# only do the following on error... #}
{% if form.errors %}
<ul class="errors">
{# you can do layers of nesting as needed to render your content #}
{% for _field in form %}
{% if _field.errors %}
{% for error in _field.errors %}
<li class={{li_class}}>{{_field.label}}: {{ error|e }}</li>
{% endfor %}
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endmacro %}
答案 1 :(得分:1)
似乎有可能。请参阅此处的文档:http://jinja.pocoo.org/docs/templates/#if
答案 2 :(得分:1)
答案是肯定的。
我在实时应用程序中使用与您的逻辑非常相似的逻辑,并且嵌套的if块按预期工作。如果你不保持你的代码干净,它可能会有点混乱,但它工作正常。
答案 3 :(得分:0)
快速补充一下,如果您要解包数据以填充字段,Jinja 只会解包一次。我在 MongoDB 中遇到了类似的问题,发现如果您将项目更改为列表项目,您会在不嵌套的情况下多次迭代它
@app.route("/")
@app.route("/get_shrink")
def get_shrink():
# find and sort shrink top 5
shrink = list(mongo.db.shrinkDB.find().limit(5).sort(
"amount_lost_value", -1,))
return render_template(
"shrink.html", shrinkDB=shrink)
{% for shrink in shrinkDB %}
{% if shrink.resolved == true %}
<li>{{ shrink.product_name }} ||£ {{ shrink.amount_lost_value }} || {{ shrink.date }}</li>
{% endif %}
{% endfor %}
</span>
</div>
</div>
<div class="col s12 m5 offset-m2">
<h4>Top 5 Resolved Threats</h4>
<div class="card-panel light-blue">
<span class="white-text">
<!-- Shrink For loop top 5 resolves-->
{% for shrink in shrinkDB %}
{% if shrink.resolved != true %}
<li>{{ shrink.product_name }} ||£ {{shrink.amount_lost_value }} || {{ shrink.date }}</li>
{% endif %}
{% endfor %}