Django模板{% if x == y %}语句中如何正确比较两个变量?
Django模板if标签变量相等判断失效修复
问题表现
在Django模板中编写下拉框选项选中逻辑时,需要通过{% if x == y %}实现两个变量的相等比较,初始代码如下:
<title>Category: {{category_id}}</title> <select name="category_id"> {% for category in categories %} <option value="{{category.id}}" {% if category.id is category_id %} selected {% endif %}>{{category.id}} : {{category.name}}</option> {% endfor %} </select>
已知{{category_id}}已正确传入模板上下文,在if标签外部可正常渲染,但if判断内部始终无法正常生效,具体异常情况如下:
- 编写
{% if category.id == category_id %}时判断无效果,易误以为category_id被识别为字面量而非上下文变量 - 编写
{% if category.id is {{category_id}} %}、{% if category.id == {{category_id}} %}时直接抛出解析错误:Could not parse the remainder: '{{category_id}}' from '{{category_id}}' - 编写
{% if category.id is category.id %}时语法可正常运行,但会导致循环内所有下拉选项都被标记为selected状态,不符合业务预期
故障原因
- Django模板标签语法规则:
{% %}包裹的标签内部直接写变量名即可从上下文取值,不需要也不能加{{}}包裹变量,在if标签内写{{category_id}}属于语法错误,因此触发解析报错。 - 判断失效核心原因:参与比较的两个变量类型不匹配。通常
category.id是模型自动生成的整数字段,而从URL参数、请求参数中获取的category_id默认是字符串类型,类型不同时值相等判断自然不会成立。 - 运算符使用错误:
is在Python及Django模板中是判断两个对象是否为同一内存引用,并非判断值相等,因此{% if category.id is category.id %}会永远成立,导致所有选项被选中。
修复方法
方法1:视图层预处理(推荐)
在视图函数中提前把category_id转换为整数类型,从根源消除类型差,示例代码:
def category_list(request): # 请求参数取出的值默认是字符串,提前转成整数 category_id = int(request.GET.get("category_id", 0)) categories = Category.objects.all() return render(request, "category.html", { "category_id": category_id, "categories": categories })
处理完成后模板中直接写{% if category.id == category_id %}即可正常实现选中判断,无需额外模板层处理。
方法2:模板层临时转换
如果不方便修改视图逻辑,可以在模板中用add过滤器把字符串类型的category_id转为整数再比较,代码如下:
{% for category in categories %} <option value="{{category.id}}" {% if category.id == category_id|add:0 %} selected {% endif %}> {{category.id}} : {{category.name}} </option> {% endfor %}
注:
add过滤器会尝试对值做数值运算,给字符串格式的数字加0会自动转换为整数类型,匹配category.id的类型后即可正常判断相等。
注意事项
模板中做值相等判断统一使用==运算符,不要用is做值比较,避免出现引用判断的逻辑异常。
内容的提问来源于stack exchange,提问作者Kbeen
相关产品推荐
相关产品推荐

