Шаблоны Django: если ложно? - PullRequest
       8

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

57 голосов
/ 20 ноября 2010

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

{% if myvar == False %}

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

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

Ответы [ 10 ]

30 голосов
/ 27 июля 2011

Для потомков у меня есть несколько 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.

26 голосов
/ 05 мая 2015

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'
22 голосов
/ 20 ноября 2010

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

from django.template import Library

register = Library()

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

Тогда в вашем шаблоне:

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

Конечно, вы можете сделать этот шаблон тега гораздо более общим ... но это подходит именно вам; -)

20 голосов
/ 25 ноября 2011

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

{% if not myvar %}
9 голосов
/ 18 июля 2013

В старой версии вы можете использовать только 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 %}

Как в случае, еслиtag, условие {% 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/

5 голосов
/ 08 октября 2012

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

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

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

Или, если вы предпочитаете волноваться за все это ...

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

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

4 голосов
/ 27 ноября 2013

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

Например:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
3 голосов
/ 19 марта 2018

Я только что придумал следующее, что хорошо выглядит в Django 1.8

Попробуйте вместо значения не False:

if value|stringformat:'r' != 'False'

Попробуйте вместо значения True:

if value|stringformat:'r' == 'True'

, если вы действительно не возились с методами repr , чтобы значение выглядело как логическое значение. Я считаю, что это должно дать вам достаточно уверенности в том, что значение равно True или False.

3 голосов
/ 20 ноября 2010

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

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

Если вы хотите проверить только, имеет ли оно значение false, просто

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

РЕДАКТИРОВАТЬ: Кажется, это работает.

{% 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 %}

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

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

{% if some_bool in false_list %}False {% endif %}
2 голосов
/ 20 ноября 2010

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

myvar is False

Иллюстрирование:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...