Почему логика моего состояния не работает так, как ожидалось в Jinja2/CherryPy?


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

Возвращает <div>False</div>, даже если bCat2 равно True. Спасибо, Андрей

5 12

5 ответов:

Эта часть документации может помочь вам:

Специальные константы true, false и none действительно являются строчными. Потому что это вызвало путаницу в прошлом, когда написание True расширяет к неопределенной переменной, которая считается ложной, все три из них может быть написано и в титульном падеже (True, False и None). Однако для последовательность (все идентификаторы Jinja строчные) Вы должны использовать версии в нижнем регистре .

Источник: http://jinja.pocoo.org/docs/templates/

Попробуйте этот код:

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

Чтобы проверить булеву переменную в шаблоне, преобразуйте ее в строку в Python

str(bCat2)

И затем сравнил его со строкой в шаблоне

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

Правильный способ сделать это в 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, то это также будет считаться истинным.

Вариант 1: Наиболее распространенное решение

Решите это, как это делает python.

Проверьте, является ли переменная true

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

Проверьте, является ли переменная false

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

Jinja2 If documentation

Вариант 2: Решение Jinja2 sameas

Решайте, как jinja2. Becareful с булевым строчным регистром.

Проверьте, является ли переменная true

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

Проверьте, является ли переменная false

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

Jinja2 sameas documentation

Я хотел бы добавить, что если ваша логика немного сложнее, вы можете прочитать о scopes.

Как указано в официальной документации :

Начиная с версии 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 }}