Шаблоны Django: False vs. None - PullRequest
       5

Шаблоны Django: False vs. None

14 голосов
/ 15 июля 2010

Как я могу различить None и False в шаблонах django?

{% if x %}
True 
{% else %}
None and False - how can I split this case?
{% endif %}

Ответы [ 5 ]

12 голосов
/ 16 июля 2010

Каждый контекст шаблона 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
5 голосов
/ 15 июля 2010

Вы можете создать пользовательский фильтр:

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

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

2 голосов
/ 09 января 2012

Улучшение предыдущих ответов может быть:

{% 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 %}
0 голосов
/ 28 мая 2013

Вот еще один хитрый способ:

{% if not x.denominator %}
    None
{% else %}
    {% if x %}
        True
    {% else %}
        False
    {% endif %}
{% endif %}

Это потому, что «None» не имеет атрибута «знаменатель», в то время как для «True» и «False» оно равно 1.

0 голосов
/ 30 января 2012

Создать context_processor (или использовать из модуля django-misc 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...