Как я могу различать None и False в шаблонах django?
{% if x %}
True
{% else %}
None and False - how can I split this case?
{% endif %}
Как я могу различать None и False в шаблонах django?
{% if x %}
True
{% else %}
None and False - how can I split this case?
{% endif %}
Каждый контекст шаблона 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
Вы можете создать собственный фильтр:
@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 %}
Конечно, вы можете настроить фильтр, чтобы проверить любое условие, которое вам нравится...
Улучшение предыдущих ответов может быть:
{% 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 %}
Создайте контекстный_процессор (или используйте 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}
Вот еще один сложный способ:
{% if not x.denominator %}
None
{% else %}
{% if x %}
True
{% else %}
False
{% endif %}
{% endif %}
Это потому, что "None" не имеет атрибута "знаменатель", а для "True" и "False" - 1.