値がNone
のときに"None"
を印刷しないようにJinja2を説得するにはどうすればよいですか?
辞書には多くのエントリがありますが、異なるキーワードに対して特別なケースを持たせるのではなく、すべてを単一のループで出力したいと思います。 None
(文字列ではなくNoneType
)の値がある場合、文字列"None"
がテンプレートのレンダリング結果に挿入されます。
{{ value or '' }}
を使用してそれを抑制しようとすると、数値ゼロも置き換えられるため、うまく機能します。
レンダリングのために辞書をJinja2に渡す前に辞書をフィルターする必要がありますか?
Jinja2の新しいバージョン(2.9以降):
{{ value if value }}
Jinja2の古いバージョン(2.9より前):
{{ value if value is not none }}
よく働く。
これにより、elseがelseを使用しようとしていないというエラーが発生した場合..
{{ value if value is not none else '' }}
別のオプションは、環境で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) }}
Poccoメーリングリストのこの投稿によると、 https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J
Armin Ronacher(Jinja2/Flaskの作成者など)は、次の「Pythonの」スニペットを推奨しています。
{{ variable or 0 }}
{{ variable or '' }}
ここでの概念は、暗黙的よりも明示的であることが望ましいということです。
編集:選択した答えは間違いなく正しいものです。テンプレート変数が文字列または数値のゼロになるような状況に実際に遭遇したことはないので、上記のスニペットはテンプレートのコードノイズを減らすのに役立つかもしれません。
カスタムフィルターで問題を解決できます。次のように宣言します。
def filter_supress_none(val):
if not val is None:
return val
else:
return ''
次のようにインストールします。
templating_environment.filters['sn'] = filter_supress_none
次のように使用します。
{{value|sn}}