web-dev-qa-db-ja.com

Jinja2 / CherryPyで条件ロジックが期待どおりに機能しないのはなぜですか?

{% if bCat2 == True %}
    <div>True</div>
{% else %}
    <div>False</div>

戻り値 <div>False</div> ときでさえ bCat2Trueです。ありがとう、アンドリュー

17
Andrew Kloos

テンプレートでブール変数をテストするには、Pythonでそれを文字列に変換します

str(bCat2)

そしてそれをテンプレートの文字列と比較しました

{% if bCat2 == 'True' %}
    <div>True</div>
{% else %}
    <div>False</div>
12
Andrew Kloos

ドキュメントのこの部分は、次のことに役立ちます。

特別な定数true、false、noneは実際には小文字です。これにより過去に混乱が生じたため、Trueを書き込むとfalseと見なされる未定義の変数に展開され、3つすべてがタイトルケース(True、False、None)で書き込まれる可能性があります。ただし、一貫性を保つために(すべてのJinja識別子は小文字です)小文字のバージョンを使用する必要があります。

出典: http://jinja.pocoo.org/docs/templates/

そのコードを試してください:

{% if bCat2 == true %}
<div>True</div>
{% else %}
<div>False</div>
{% endif %}
40
Evgeni Nabokov

Jinja2でこれを行う適切な方法は次のとおりです。

{% if bCat2 is sameas true %}
    <div>True</div>
{% Elif bCat2 is sameas false %}
    <div>False</div>
{% endif %}

できない理由

{% if bCat2 == true %}

つまり、bCat2 == 1またはbCat2 == 1.0の場合もTrueと見なされます。

10
Dag Wieers

オプション1:最も一般的なソリューション

pythonのようにそれを解決します。

変数が真かどうかを確認

{% if bCat2 %}
    <div>True</div>
{% else %}
    <div>False</div>

変数がfalseかどうかを確認します

{% if not bCat2 %}
    <div>False</div>
{% else %}
    <div>True</div>

Jinja2ドキュメントの場合

オプション2:Jinja2 sameasソリューション

Jinja2のように解決します。 ブール小文字の注意

変数が真かどうかを確認

{% if bCat2 is sameas true %}
    <div>True</div>
{% endif %}

変数がfalseかどうかを確認します

{% if bCat2 is sameas false %}
    <div>False</div>
{% endif %}

Jinja2はドキュメントと同じ

9
mrroot5

ロジックがもう少し複雑な場合は、スコープについて読みたいと思うかもしれないことを付け加えたいと思います。

公式ドキュメント で述べたように:

バージョン2.10以降では、名前空間オブジェクトを使用して、より複雑なユースケースを処理できます。これにより、スコープ全体に変更を伝達できます。

{% set ns = namespace(found=false) %}
{% for item in items %}
    {% if item.check_something() %}
        {% set ns.found = true %}
    {% endif %}
    * {{ item.title }}
{% endfor %}
Found item having something: {{ ns.found }}
1
Pitto