Django模板布尔变量显示为0但被认为是True,为什么?
我有一些模板变量,可以用 {{ myclass.myvariable }}
正确显示为 1 或 0。
但是当我在 if 语句中使用它们 {% if myclass.myvariable %}
时,它们总是被认为是 True,即使值是 0。
这些变量在我的模型中是 1 个字符的字符字段 choices
,存储为 0 或 1,而 Django 模板系统的第 4 章说:
'在 Python 中,空列表([])、元组(())、字典({})、字符串('')、零(0)和特殊对象 None 在布尔上下文中都是 False。其他所有情况都是 True。'
我没有在模型中使用 BooleanField
,因为我还有选择值 2、3、4……
这可能是什么问题呢?
3 个回答
0
它们被当作字符串来处理(也就是说是 '0'
字符串和 '1'
字符串,而不是 0
整数和 1
整数)。
如果你在命令行的 Python 中输入 bool(0)
或 bool(False)
,你会得到 False
,但是如果你输入 bool('0')
,你会得到 True
。
1
如果你从一个 CharField
中获取值,那么它是 '0'
,而不是 0
。
>>> True if 0 else False
False
>>> True if '0' else False
True
6
因为 '0'
(字符串)和 0
(整数)是不同的。'0'
是一个非空字符串,这意味着在布尔上下文中它被认为是 True
。如果你要存储整数,应该使用 IntegerField
或 PositiveIntegerField
,而不是 CharField
。