如何在Django中处理多个同名不同值复选框的表单提交问题
问题解决方法
核心原因
Django的request.POST是QueryDict类型对象,直接用[键名]的方式获取同名参数时,只会返回最后一个值,丢弃前面的多个值。
具体实现
不需要修改现有HTML代码,也不需要额外定义表单类,仅修改视图的post方法即可:
- 用
QueryDict自带的getlist()方法获取所有同名复选框的值,传入复选框的name属性值作为参数,会直接返回所有选中项的value组成的列表,未选中时返回空列表。 - 如果需要过滤非法提交的参数,只保留当前页面渲染过的图标,可以加一层列表推导做校验。
代码示例
修改后的post方法代码:
def post(self, request): # 直接获取所有选中的display_type值 picked_icons = request.POST.getlist('display_type') # 可选:过滤非法值,只保留当前页面展示过的图标 picked_icons = [icon for icon in picked_icons if icon in self.icon_to_show] print(picked_icons) # 此处会输出所有选中的图标值列表 # 如果需要存入MemoryResult模型,可将列表转为逗号分隔字符串存储 latest_memory = request.user.memoryresult_set.last() if latest_memory: latest_memory.picked_imges_names = ','.join(picked_icons) latest_memory.save() return render(request, 'accounts/home.html')
补充说明
如果后续需要读取存储的选中值,直接用split(',')方法把字符串转回列表即可。
内容的提问来源于stack exchange,提问作者Natalia Szczepanek
相关产品推荐
相关产品推荐

