Djangoには{%empty%}と呼ばれるこの本当にクールなタグがあります。これにより次のことが可能になります。
{% for item in list %}
<tr><td>{{ item }}</td></tr>
{% empty %}
<tr><td>Nothing to show!</td></tr>
{% endfor %}
の略です
{% if list %}
{% for item in list %}
<tr><td>{{ item }}</td?</tr>
{% endfor %}
{% else %}
<tr><td>Nothing to show!</td></tr>
{% endif %}
ジンジャに切り替えてから、このタグを本当に見逃してしまいました:(
それはすでに存在します。 forループで{% else %}
を使用します。 残念ながら、Djangoが空を作成する前に他にありましたが、Djangoのセマンティクスに一致するように名前を変更するのはちょっと奇妙です。
ああなるほど。 たぶん、それをdjangoセクションの下の「他のテンプレートエンジンからの切り替え」にメモしてください。
これは、スイッチングのドキュメントには記載されていません。 これは、コントロールの構造に記載されています:ドキュメント用ですが、スイッチングドキュメントに含めると便利です...
コードのlist
がジェネレーターであり、 for
およびif
ブロックがPythonと同じように機能する場合、 if-for
構造は問題を解決しません。ジェネレーターは常に真実であるため、さらにそのような構成はempty
ブロックよりも慣用的ではありません。
ループが実行されたかどうかを確認するフラグを追加したり、 NameError: name 'item' is not defined
を確認したり、Jinjaレベルでヘルパー変数をlist(generator)
に追加したりできるかどうかはわかりません。 そうでない場合、唯一の解決策は、 empty
ブロックを追加するか、Python開発者に空のジェネレーターを偽造するように説得することです( StopIteration
を処理してポップされたアイテムを「プッシュバック」することで醜いチェックを避けるため)。
Jinjaのelse
ブロックは、すでにDjangoのempty
ブロックと同じように機能します。 ここでは変更は必要ありません。
最も参考になるコメント
それはすでに存在します。 forループで
{% else %}
を使用します。 残念ながら、Djangoが空を作成する前に他にありましたが、Djangoのセマンティクスに一致するように名前を変更するのはちょっと奇妙です。