Шаблоны Django: False vs. Нет
Как я могу различать None
и False
в шаблонах django?
{% if x %}
True
{% else %}
None and False - how can I split this case?
{% endif %}
Ответы
Ответ 1
Каждый контекст шаблона Django содержит True
, False
и None
. Для Django 1.10 и более поздних версий вы можете сделать следующее:
{% if x %}
True
{% elif x is None %}
None
{% else %}
False (or empty string, empty list etc)
{% endif %}
Django 1.9 и ранее не поддерживают оператор is
в теге if
. В большинстве случаев нормально использовать {% if x == None %}
.
{% if x %}
True
{% elif x == None %}
None
{% else %}
False (or empty string, empty list etc)
{% endif %}
С Django 1.4 и ранее у вас нет доступа к True
, False
и None
в контексте шаблона. Вы можете использовать yesno
.
В представлении:
x = True
y = False
z = None
В шаблоне:
{{ x|yesno:"true,false,none" }}
{{ y|yesno:"true,false,none" }}
{{ z|yesno:"true,false,none" }}
Результат:
true
false
none
Ответ 2
Вы можете создать собственный фильтр:
@register.filter
def is_not_None(val):
return val is not None
затем используйте его:
{% if x|is_not_None %}
{% if x %}
True
{% else %}
False
{% endif %}
{% else %}
None
{% endif %}
Конечно, вы можете настроить фильтр, чтобы проверить любое условие, которое вам нравится...
Ответ 3
Улучшение предыдущих ответов может быть:
{% if x|yesno:"2,1," %}
# will enter here if x is True or False, but not None
{% else %}
# will enter only if x is None
{% endif %}
Ответ 4
Создайте контекстный_процессор (или используйте django-misc module misc.context_processors.useful_constants
) с константами True
, False
, None
и используйте {% if x == None %}
или {% if x == False %}
context_processor.py
:
def useful_constants(request):
return {'True': True, 'False': False, 'None': None}
Ответ 5
Вот еще один сложный способ:
{% if not x.denominator %}
None
{% else %}
{% if x %}
True
{% else %}
False
{% endif %}
{% endif %}
Это потому, что "None" не имеет атрибута "знаменатель", а для "True" и "False" - 1.