Jinja2是否支持嵌套的if语句?

25

我阅读了文档,但是对于这个问题并不清楚。我知道可以使用嵌套的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 %}

还是说格式应该以某种方式不同?

4个回答

22
Jinja2支持嵌套块,包括if语句和其他控制结构。
请参阅块嵌套和作用域的文档:“块可以嵌套以实现更复杂的布局。”
这个功能的一个很好的用例是编写根据条件输出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 %}

2
答案是肯定的。
我在一个实时应用程序中使用与您非常相似的逻辑,并且嵌套的if块按预期工作。如果您不保持代码清洁,可能会有点混乱,但它可以正常工作。

1

顺便提一下,如果您正在解包数据以填充字段,则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 %}


0

3
我看到了那个 - 那不一定是嵌套的。 - ShanaC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接