【问题标题】:Does Jinja2 support nested if statements?Jinja2 是否支持嵌套 if 语句?
【发布时间】:2013-12-06 17:32:08
【问题描述】:

我阅读了文档,但我不清楚这是否正确。我知道您可以使用嵌套的 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 %}

或者格式应该有所不同?

【问题讨论】:

    标签: python django django-templates jinja2


    【解决方案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 %}

    【讨论】:

      【解决方案2】:

      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 %}
      

      【讨论】:

        【解决方案3】:

        答案是肯定的。

        我在实时应用程序中使用的逻辑与您的逻辑非常相似,并且嵌套的 if 块按预期工作。如果您不保持代码干净,可能会有些混乱,但它可以正常工作。

        【讨论】:

          【解决方案4】:

          这似乎是可能的。请参阅此处的文档:http://jinja.pocoo.org/docs/templates/#if

          【讨论】:

          • 我看到了——不一定是嵌套的
          猜你喜欢
          • 1970-01-01
          • 2014-10-07
          • 1970-01-01
          • 2012-05-13
          • 2010-11-30
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多