Шаблоны 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.