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

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

возвращает <div>False</div>, даже если bCat2 и True. Спасибо, Эндрю!--5-->

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 если документация

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

решить, как jinja2 делать. Becareful с логическими строчные.

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

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

проверьте, является ли переменная ложные

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

Jinja2 sameas документация


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

Как говорится в официальная документация:

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