web-dev-qa-db-ja.com

Jinja2では、変数が未定義かどうかをどのようにテストしますか?

Djangoから変換して、私はこのようなことをするのに慣れています:

{% if not var1 %} {% endif %}

var1をコンテキストに入れなかった場合に機能します。 Jinja2では未定義のエラーが発生します。 {% if var1 == None %}などと簡単に言う方法はありますか?

153
freyley

Jinja2から テンプレートデザイナーのドキュメント

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}
273
Garrett

変数がNoneの場合、{% if variable is defined %}はtrueです。

not is Noneは許可されないため、それはつまり

{% if variable != None %}

本当に唯一の選択肢です。

25
Carsten Agger

次のように、jinja2テンプレートで変数を定義することもできます。

{% if step is not defined %}
{% set step = 1 %}
{% endif %}

そして、次のように使用できます:

{% if step == 1 %}
<div class="col-xs-3 bs-wizard-step active">
{% Elif step > 1 %}
<div class="col-xs-3 bs-wizard-step complete">
{% else %}
<div class="col-xs-3 bs-wizard-step disabled">
{% endif %}

それ以外の場合({% set step = 1 %}を使用しない場合)、上位コードがスローされます。

UndefinedError: 'step' is undefined
11
czerasz

環境設定では、undefined = StrictUndefinedがあり、未定義の値が何にも設定されないようにしました。これにより修正されました。

from jinja2 import Undefined
JINJA2_ENVIRONMENT_OPTIONS = { 'undefined' : Undefined }
11
freyley

必要な場合は、デフォルトのフィルターの使用を検討してください。例えば:

{% set Host = Jabber.Host | default(default.Host) -%}

または、最後に「ハードコード化された」フォールバック値を使用します。

{% set connectTimeout = config.stackowerflow.connect.timeout | default(config.stackowerflow.timeout) | default(config.timeout) | default(42) -%}
4
Lubomir Varga

{% if variable is defined %}は、何かが未定義であるかどうかを確認するために機能します。

変数をデフォルトのFalseにすると、{% if not var1 %}を使用して回避できます

class MainHandler(BaseHandler):
    def get(self):
        var1 = self.request.get('var1', False)
1
lee penkman