
在django模板中,布尔条件判断不能照搬python语法——`{% if feature.is_true == true %}` 无法正常工作,因为`true`被当作未定义变量而非python布尔字面量;应直接使用 `{% if feature.is_true %}` 进行真值判断。
Django模板语言(DTL)对布尔值的处理与Python不同:它不支持True/False字面量,也不支持==运算符用于布尔比较。当你在模板中写 {% if feature.is_true == True %} 时,Django会将 True 解析为一个上下文变量名(类似 {{ True }}),而该变量并未在视图中传入,因此其值为 None,导致整个表达式等价于 feature.is_true == None,自然恒为 False。
✅ 正确写法是利用Django模板的隐式真值判断(truthiness evaluation):
{% if feature.is_true %}
Yes, this is True
{% endif %}这会自动检查 feature.is_true 是否为“真值”(即非空、非零、非None、非False)。对于模型字段如 models.BooleanField(),只要数据库中存的是 True,该条件即可准确触发。
⚠️ 注意事项:
- 不要写 {% if feature.is_true == true %}(小写true同样无效,DTL不识别);
- 避免 {% if feature.is_true == "True" %}(字符串比较错误,且易受类型干扰);
- 若需显式区分 None 和 False(例如字段允许为空),可结合 is None 检查:
{% if feature.is_true and feature.is_true is not None %}Explicitly True (not None)
{% endif %} - 确保视图中确实将 features 列表传入模板,且每个 feature 对象的 is_true 属性已正确加载(如通过 select_related() 或避免N+1查询)。
总结:Django模板中的if标签设计为简洁实用,遵循“只判断值是否存在/是否为真”的哲学。摒弃Python式的显式比较,拥抱 {% if obj.attr %} 这一惯用法,既安全又符合框架规范。









