为什么给Django表单添加样式或widgets后,数据无法保存到数据库?
问题根源
category字段为ForeignKey外键类型,默认对应单选Select表单控件,你自定义widget时错误使用了SelectMultiple多选控件,提交的多选值为列表格式,不符合外键字段要求的单个值格式,导致表单验证不通过,因此不会触发保存逻辑。
修复步骤
- 修正表单widget配置
将category字段的控件改回Select即可,修改后的表单代码如下:
class create(ModelForm): class Meta: model = listing fields = [ 'title', 'describtion','bid','category','image'] widgets={ 'title': TextInput(attrs={'class':'form-control'}), 'describtion': TextInput(attrs={'class':'form-control'}), 'image': TextInput(attrs={'class':'form-control'}), 'bid': NumberInput(attrs={'class':'form-control'}), # 此处将SelectMultiple改为Select 'category': Select(attrs={'class':'form-control'}), }
- 修复视图层隐藏问题
你当前GET请求渲染页面时,传递的是表单类而非实例,虽然部分场景下能运行,但不符合Django规范,修改如下:
def CreateListing(request): user = request.user if request.method == "POST": form = create(request.POST, request.FILES) if form.is_valid(): form.instance.user = user form.save() return redirect('listing') # 开发调试时可打开下方打印语句,直接查看表单验证错误原因 # else: # print(form.errors) else: # 实例化空表单再传递到模板 return render(request, "auctions/Create.html",{ 'form': create() })
额外优化建议
- 金额字段
bid建议改用DecimalField替代FloatField,避免浮点精度问题 - 模型字段
describtion拼写有误,正确拼写为description,建议统一修改避免后续开发混淆
内容的提问来源于stack exchange,提问作者Salam-16
相关产品推荐
相关产品推荐

