Django 템플릿 : 거짓이면?
Django 템플릿 구문을 사용하여 변수가 False 인지 어떻게 확인 합니까?
{% if myvar == False %}
작동하지 않는 것 같습니다.
Python 값이 있는지 확인하고 싶습니다 False
. 이 변수는 빈 배열도 될 수 있는데, 이것은 내가 확인하고 싶은 것이 아닙니다 .
Django 1.10 (릴리스 노트) 은 태그에 is
및 is 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
, False
및 None
해당 파이썬은 객체로.
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
'programing tip' 카테고리의 다른 글
"Ctrl"/ "Shift"+ 마우스 왼쪽 버튼 클릭을위한 JavaScript 또는 jQuery 이벤트 핸들러 (0) | 2020.12.11 |
---|---|
XML 문자열을 XmlElement로 변환해야합니다. (0) | 2020.12.11 |
사이트에 포함 된 Javascript를 자동으로 축소 할 수있는 플러그인이 있습니까? (0) | 2020.12.11 |
hash_map이 STL의 일부입니까? (0) | 2020.12.11 |
Rsync include 및 exclude 옵션을 사용하여 패턴별로 디렉터리 및 파일 포함 (0) | 2020.12.11 |