Jinja2 Если игнорирует логическое значение - PullRequest
0 голосов
/ 22 марта 2019

У меня есть шаблон Jinja2, в котором переменная, которая разрешается как логическое значение False, игнорируется в операторе {% if %}.

Соответствующий фрагмент шаблона выглядит как

{% if user.can_manage_techniques %}j
{% block submenu_items %}
<li class="pure-menu-item"><a href={{ url_for('new_technique') }} class="pure-menu-link">New Technique</a></li>
{% endblock %}
{% endif %}

Пользователь установлен в шаблоне рендеринга как

    return render_template('technique_list.j2',
                            techniques=Technique.find_all(),
                            **state())

с состоянием, являющимся функцией, которая возвращает dict [string, object].

Пользователь, который ему передается, задается в __init__ объекта как переменная - так:

    def __init__(self):
        self.can_manage_techniques = False

Даже если can_manage_techniques равно false, элемент списка по-прежнему отображается. Как мне заставить {% if %} осознать, что это ложь, и перейти к {% endif %}?

Я также пробовал == true и sameas true

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Я не могу воспроизвести вашу проблему на локальном компьютере с минимальным приложением ниже:

from flask import Flask, render_template_string
app = Flask(__name__)

@app.route('/')
def hello():
    return render_template_string('''
        {{ can }}
        {% if can %}
            {% block submenu_items %}
                <li class="pure-menu-item">New Technique</li>
            {% endblock %}
        {% endif %}
        ''', can=False)

IMO, использование правильное, поэтому вам может понадобиться проверить более связанный код.

Я выяснил, почему это произошло после проверки вашего кода на GitHub. Эта проблема, вызванная поведением наследования шаблона: В дочернем шаблоне содержимое вне блока будет пропущено .

Поскольку ваш шаблон является дочерним шаблоном, вам нужно поместить оператор if в блок.

0 голосов
/ 23 марта 2019

Если оператор {% if %} находится вне блока - он игнорируется. Если это находится внутри блока, это успешно. Я не знаю почему, но это было исправлением:

{% block submenu_items %}
{% if user.can_manage_techniques == true %}
<li class="pure-menu-item"><a href={{ url_for('new_technique') }} class="pure-menu-link">New Technique</a></li>
{% endif %}
{% endblock %
0 голосов
/ 22 марта 2019

Я полагаю, что это может быть то, как вы определяете True и False, в python это должен быть логический тип (вы можете проверить с помощью type(test)). Это не должно быть строки или что-то еще. Причина, по которой он всегда возвращает значение true, может заключаться в том, что строки, не являющиеся пустыми, имеют значение true (например, Bool('false') равно True, а Bool('') равно False).

from jinja2 import Template

template = Template(
    """{% if test %}
{% block submenu_items %}
My Stuff
{% endblock %}
{% endif %}
""")

Если я выполню одно из следующих действий, я получу ожидаемый результат:

template.render(test=False)
template.render(test=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...