Django 3.1.4:在views.py视图函数中获取复选框选中值的方法
代码问题根源与修正方案
现有代码存在两处会导致取值失败的核心问题,修正后即可在视图中直接获取所有复选框选中值,完全不需要关联数据库存储逻辑:
1. 修正HTML端的表单字段命名错误
原代码中复选框写的name="checks []"在方括号前多了多余空格,无论是浏览器原生表单提交逻辑,还是Django的请求参数解析流程,都无法正确匹配这个带空格的字段名,需要删除多余空格:
<form action="essai"> <input type="checkbox" name="checks[]" value="1" /> <input type="checkbox" name="checks[]" value="2" /> <input type="checkbox" name="checks[]" value="3" /> <input type="submit"> </form>
额外说明:复选框的组名不强制要求带方括号,只要前后端命名统一即可——比如把所有checkbox的name统一写成
checks,视图中用对应字段名取值也完全生效,核心是字段名不能夹杂多余空格。
2. 修正视图端的取值逻辑
Django的request.GET是特殊的QueryDict对象,直接硬取字段的方式存在两个问题:
- 就算字段名完全匹配,只要同名字段对应了多个值(也就是用户选了2个及以上复选框),直接用
request.GET['字段名']的字典式写法,会触发MultipleObjectsReturned异常,根本拿不到值 - 如果用户没有选中任何复选框,对应的字段根本不会出现在请求参数中,硬取会触发
KeyError导致页面报500错误
要拿到同名字段对应的所有选中值,必须调用QueryDict自带的getlist()方法,修正后的视图代码如下:
def essai(request): # getlist会返回所有选中值组成的列表,未选中任何项时自动返回空列表,不会报错 selected_checks = request.GET.getlist('checks[]') # 表单传值默认都是字符串类型,需要作为数值参数使用时可直接转换 script_params = [int(val) for val in selected_checks] # 转换后的script_params列表可以直接作为图像检索脚本的入参使用 return render(request, 'blog/article.html', {'result': script_params})
关键注意点
- 浏览器提交表单时,只会传递处于选中状态的复选框值,未选中的项不会出现在请求参数中,不需要额外遍历判断每个选项的选中状态
- 如果需要设置默认选中项,直接在对应checkbox标签上添加
checked属性即可,不影响后端取值逻辑 - 同名字段多值取数必须用
getlist(),这是Django QueryDict的固定用法,没有其他更便捷的取数方式
内容的提问来源于stack exchange,提问作者Simon Renuart
相关产品推荐
相关产品推荐

