web-dev-qa-db-ja.com

Jinja2はネストされたifステートメントをサポートしていますか?

ドキュメントを読みましたが、これが正しいかどうかはわかりません。ネストされたforループを使用できることは知っていますが、ステートメントが異なるように思われる場合。

次のことはできますか?

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

それともフォーマットはどういうわけか違うべきですか?

11
ShanaC

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

答えはイエスです。

私はライブアプリケーションであなたと非常によく似たロジックを使用しており、ネストされたifブロックは期待どおりに機能します。コードをクリーンに保たないと少し混乱する可能性がありますが、正常に機能します。

1
Alex P. Miller

それは可能のようです。こちらのドキュメントを参照してください: http://jinja.pocoo.org/docs/templates/#if

1
stickyb1t