web-dev-qa-db-ja.com

Jinja2でのリストのテスト

私が見る限り、オブジェクトがJinja2のListインスタンスであるかどうかをテストする方法はありません。 1つ目は正しいですか、2つ目は、誰かがJinja2にカスタムテスト/拡張機能を実装しましたか?どんな助けでも素晴らしいでしょう。

23
MFB

これは、jinja2でカスタムフィルターを使用して簡単に行うことができます。

まず、テストメソッドを作成します。

def is_list(value):
    return isinstance(value, list)

そしてそれをカスタムフィルターとして追加します:

j = jinja2.Jinja2(app)
j.environment.filters.update({
        'is_list': is_list,
})
15
fredrik

私はそれをこのようにしました:

{% if var is iterable and var is not string %}
54
insider

私の設定では、値を文字列またはJinjaテンプレートに含まれる文字列のリストのいずれかにしたいと考えています。だから私が本当に気にしたのは文字列とリストではなく、単一のアイテムと複数のアイテムだった。この回答は、ユースケースが類似している場合に役立ちます。

「リストですか?」の組み込みテストがないので。文字列も拒否するため、APIデザインからパターンを借りて、単一オブジェクトをPython側のリストにラップし、次にJinja側のリストの長さを確認しました。

Python:

_context = { ... }

# ex. value = 'a', or ['a', 'b']
if not isinstance(value, list):
    value = [value]

context['foo'] = value
_

ジンジャ:

_{% if foo|length == 1 %}
  single-item list
{% Elif foo|length > 1 %}
  multi-item list
{% endif %}
_

また、表示目的でアイテムセパレーターを追加するだけの場合は、明示的な長さチェックをスキップして、{{ value|join(', ') }}だけを実行できます。

1
Taylor Edmiston

Jinjaには多くの組み込みテストがあります。あなたはおそらく iterable を探しています。

{% if var is iterable %}
0
Zack