web-dev-qa-db-ja.com

Jinja2で文字列として「なし」出力を抑制する

値がNoneのときに"None"を印刷しないようにJinja2を説得するにはどうすればよいですか?

辞書には多くのエントリがありますが、異なるキーワードに対して特別なケースを持たせるのではなく、すべてを単一のループで出力したいと思います。 None(文字列ではなくNoneType)の値がある場合、文字列"None"がテンプレートのレンダリング結果に挿入されます。

{{ value or '' }}を使用してそれを抑制しようとすると、数値ゼロも置き換えられるため、うまく機能します。

レンダリングのために辞書をJinja2に渡す前に辞書をフィルターする必要がありますか?

49
Spaceghost

Jinja2の新しいバージョン(2.9以降):

{{ value if value }}

Jinja2の古いバージョン(2.9より前):

{{ value if value is not none }} よく働く。

これにより、elseがelseを使用しようとしていないというエラーが発生した場合..

{{ value if value is not none else '' }}

45
Joran Beasley

別のオプションは、環境でfinalizeフックを使用することです。

>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'

だが:

>>> def my_finalize(thing):
...     return thing if thing is not None else ''
...
>>> e = jinja2.Environment(finalize=my_finalize)
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / '

デフォルトのフィルター

{{ value|default("", True) }}
22
solarc

Poccoメーリングリストのこの投稿によると、 https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher(Jinja2/Flaskの作成者など)は、次の「Pythonの」スニペットを推奨しています。

{{ variable or 0 }}{{ variable or '' }}

ここでの概念は、暗黙的よりも明示的であることが望ましいということです。

編集:選択した答えは間違いなく正しいものです。テンプレート変数が文字列または数値のゼロになるような状況に実際に遭遇したことはないので、上記のスニペットはテンプレートのコードノイズを減らすのに役立つかもしれません。

18
Brownbay

カスタムフィルターで問題を解決できます。次のように宣言します。

def filter_supress_none(val):
    if not val is None:
        return val
    else:
        return ''

次のようにインストールします。

templating_environment.filters['sn'] = filter_supress_none

次のように使用します。

{{value|sn}}
14
AlexVhr