programing tip

Django 템플릿 : 거짓이면?

itbloger 2020. 12. 11. 07:55
반응형

Django 템플릿 : 거짓이면?


Django 템플릿 구문을 사용하여 변수가 False 인지 어떻게 확인 합니까?

{% if myvar == False %}

작동하지 않는 것 같습니다.

Python 값이 있는지 확인하고 싶습니다 False. 이 변수는 빈 배열도 될 수 있는데, 이것은 내가 확인하고 싶은 것이 아닙니다 .


Django 1.10 (릴리스 노트)태그에 isis not비교 연산자를 추가했습니다 if. 이러한 변경으로 인해 템플릿에서 ID 테스트가 매우 간단 해집니다.

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'

당신은 버전 1.5으로 다음 이전 장고를 사용하는 경우 (릴리스 노트) 템플릿 엔진 해석 True, FalseNone해당 파이썬은 객체로.

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'

후손을 위해 몇 가지 NullBooleanField가 있으며 여기에 내가하는 일이 있습니다.

다음과 같은지 확인하려면 True:

{% if variable %}True{% endif %}

이것이 맞는지 확인하려면 False(True / False / None의 3 개 값만 있기 때문에 작동합니다) :

{% if variable != None %}False{% endif %}

다음과 같은지 확인하려면 None:

{% if variable == None %}None{% endif %}

이유는 모르겠지만 할 수는 없지만 할 variable == False수 있습니다 variable == None.


6 줄의 코드로이 작업을 수행하는 사용자 지정 템플릿 필터를 작성할 수 있습니다.

from django.template import Library

register = Library()

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

그런 다음 템플릿에서 :

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

물론 템플릿 태그를 훨씬 더 일반적으로 만들 수는 있지만 특히 필요에 적합합니다 ;-)


나는 이것이 당신을 위해 일할 것이라고 생각합니다.

{% if not myvar %}

이전 버전에서는 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 %}

if 태그에서와 같이 {% else %} 절은 선택 사항입니다.

인수는 하드 코딩 된 문자열 일 수 있으므로 다음이 유효합니다.

{% ifequal user.username "adrian" %} ... {% endifequal %} An alternative to the ifequal tag is to use the if tag and the == operator.

ifnotequal Just like ifequal, except it tests that the two arguments are not equal.

An alternative to the ifnotequal tag is to use the if tag and the != operator.

However, now we can use if/else easily

{% if somevar >= 1 %}
{% endif %}

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

Complex expressions

All of the above can be combined to form complex expressions. For such expressions, it can be important to know how the operators are grouped when the expression is evaluated - that is, the precedence rules. The precedence of the operators, from lowest to highest, is as follows:

  • or
  • and
  • not
  • in
  • ==, !=, <, >, <=, >=

More detail

https://docs.djangoproject.com/en/dev/ref/templates/builtins/


Just ran into this again (certain I had before and came up with a less-than-satisfying solution).

For a tri-state boolean semantic (for example, using models.NullBooleanField), this works well:

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

Or if you prefer getting excited over the whole thing...

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

Either way, this handles the special condition where you don't care about the None (evaluating to False in the if block) or True case.


I have had this issue before, which I solved by nested if statements first checking for none type separately.

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

If you only want to test if its false, then just

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

EDIT: This seems to work.

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

Now zero-length arrays are recognized as such; None types as None types; falses as False; Trues as trues; strings/arrays above length 0 as true.

You could also include in the Context a variable false_list = [False,] and then do

{% if some_bool in false_list %}False {% endif %}

Look at the yesno helper

Eg:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}

I've just come up with the following which is looking good in Django 1.8

Try this instead of value is not False:

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

Try this instead of value is True:

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

unless you've been really messing with repr methods to make value look like a boolean I reckon this should give you a firm enough assurance that value is True or False.


This is far easier to check in Python (i.e. your view code) than in the template, because the Python code is simply:

myvar is False

Illustrating:

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

The problem at the template level is that the template if doesn't parse is (though it does parse in). Also, if you don't mind it, you could try to patch support for is into the template engine; base it on the code for ==.

참고URL : https://stackoverflow.com/questions/4229327/django-templates-if-false

반응형