You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么给Django表单添加样式或widgets后,数据无法保存到数据库?

问题根源

category字段为ForeignKey外键类型,默认对应单选Select表单控件,你自定义widget时错误使用了SelectMultiple多选控件,提交的多选值为列表格式,不符合外键字段要求的单个值格式,导致表单验证不通过,因此不会触发保存逻辑。

修复步骤

  1. 修正表单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'}),
        }
  1. 修复视图层隐藏问题
    你当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 00:36:04