Подтвердить что ты не робот

Шаблоны Django: если false?

Как проверить, является ли переменная False с использованием синтаксиса шаблона Django?

{% if myvar == False %}

Кажется, что не работает.

Обратите внимание, что я очень хочу проверить, имеет ли значение Python False. Эта переменная также может быть пустым массивом, и это не то, что я хочу проверить.

4b9b3361

Ответ 1

Django 1.10 (примечания к выпуску) добавил операторов сравнения is и is not к тегу if. Это изменение делает проверку подлинности в шаблоне довольно простой.

In[2]: from django.template import Context, Template

In[3]: context = Context({"somevar": False, "zero": 0})

In[4]: compare_false = Template("{% if somevar is False %}is false{% endif %}")
In[5]: compare_false.render(context)
Out[5]: u'is false'

In[6]: compare_zero = Template("{% if zero is not False %}not false{% endif %}")
In[7]: compare_zero.render(context)
Out[7]: u'not false'

Если вы используете более старый Django, а затем версии 1.5 (примечания к выпуску) механизм шаблонов интерпретирует True, False и None как соответствующие объекты Python.

In[2]: from django.template import Context, Template

In[3]: context = Context({"is_true": True, "is_false": False, 
                          "is_none": None, "zero": 0})

In[4]: compare_true = Template("{% if is_true == True %}true{% endif %}")
In[5]: compare_true.render(context)
Out[5]: u'true'

In[6]: compare_false = Template("{% if is_false == False %}false{% endif %}")
In[7]: compare_false.render(context)
Out[7]: u'false'

In[8]: compare_none = Template("{% if is_none == None %}none{% endif %}")
In[9]: compare_none.render(context)
Out[9]: u'none'

Хотя он не работает так, как можно было бы ожидать.

In[10]: compare_zero = Template("{% if zero == False %}0 == False{% endif %}")
In[11]: compare_zero.render(context)
Out[11]: u'0 == False'

Ответ 2

Для потомков у меня есть несколько NullBooleanField и вот что я делаю:

Чтобы проверить, не ли это True:

{% if variable %}True{% endif %}

Чтобы проверить, не работает ли это False (обратите внимание, что это работает, потому что есть только 3 значения - True/False/None):

{% if variable != None %}False{% endif %}

Чтобы проверить, есть ли None:

{% if variable == None %}None{% endif %}

Я не уверен, почему, но я не могу сделать variable == False, но я могу сделать variable == None.

Ответ 3

Вы можете написать собственный фильтр шаблонов, чтобы сделать это в полдюжины строк кода:

from django.template import Library

register = Library()

@register.filter
def is_false(arg): 
    return arg is False

Затем в вашем шаблоне:

{% if myvar|is_false %}...{% endif %}

Конечно, вы можете сделать этот тег шаблона более универсальным... но это точно соответствует вашим потребностям: -)

Ответ 4

Думаю, это сработает для вас:

{% if not myvar %}

Ответ 5

В старой версии вы можете использовать ifequal или ifnotequal

{% ifequal YourVariable ExpectValue %}
    # Do something here.
{% endifequal %}

Пример:

{% ifequal userid 1 %}
  Hello No.1
{% endifequal %}

{% ifnotequal username 'django' %}
  You are not django!
{% else %}
  Hi django!
{% endifnotequal %}

Как и в теге if, предложение {% else%} является необязательным.

Аргументы могут быть жестко закодированными строками, поэтому допустимо следующее:

{% ifequal user.username "adrian" %}   ... {% endifequal%} Альтернативой тегу ifequal является использование тега if и оператора ==.

ifnotequal Точно так же, как ifequal, кроме этого проверяет, что два аргумента не равны.

Альтернативой тегу ifnotequal является использование тега if и оператора! =.

Однако теперь мы можем использовать if/else легко

{% if somevar >= 1 %}
{% endif %}

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

Сложные выражения

Все вышеперечисленное может быть объединено для формирования сложных выражений. Для таких выражений может быть важно знать, как операторы группируются при вычислении выражения, т.е. Правила приоритета. Приоритет операторов, от самого низкого до высшего, выглядит следующим образом:

  • или
  • и
  • не
  • в
  • ==,! =, <, > , < =, > =

Подробнее

https://docs.djangoproject.com/en/dev/ref/templates/builtins/

Ответ 6

У меня была эта проблема до, которую я решил с помощью вложенных операторов if, которые сначала проверяли тип none отдельно.

{% if object.some_bool == None %}Empty
{% else %}{% if not object.some_bool %}False{% else %}True{% endif %}{% endif %}

Если вы хотите проверить только его ложь, то просто

{% if some_bool == None %}{% else %}{% if not some_bool %}False{% endif %}{% endif %}

EDIT: похоже, это работает.

{% if 0 == a|length %}Zero-length array{% else %}{% if a == None %}None type{% else %}{% if not a %}False type{% else %}True-type {% endif %}{% endif %}{% endif %}

Теперь массивы нулевой длины распознаются как таковые; Нет типов типа None; ложь как ложь; Истины как истины; строки/массивы выше длины 0 как истинные.

Вы также можете включить в контекст переменную false_list = [False,], а затем сделать

{% if some_bool in false_list %}False {% endif %}

Ответ 7

Просто наткнулся на это снова (наверняка у меня было раньше и придумал решение, меньшее чем удовлетворение).

Для трехсловной булевой семантики (например, используя models.NullBooleanField) это хорошо работает:

{% if test.passed|lower == 'false' %} ... {% endif %}

Или, если вы предпочитаете возбуждаться по всему предмету...

{% if test.passed|upper == 'FALSE' %} ... {% endif %}

В любом случае, это обрабатывает специальное условие, в котором вам неинтересно None (оценка False в блоке if) или True.

Ответ 8

Посмотрите yesno помощник

Например:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}

Ответ 9

Это намного проще проверить в Python (т.е. ваш код представления), чем в шаблоне, потому что код Python просто:

myvar is False

Иллюстрируя:

>>> False is False
True
>>> None is False
False
>>> [] is False
False

Проблема на уровне шаблона заключается в том, что шаблон if не анализирует is (хотя он анализирует in). Кроме того, если вы не возражаете, вы можете попытаться исправить поддержку is в движке шаблона; установите его на код для ==.