Django ModelForm验证通过但无法保存至数据库求助
问题排查与修复
核心错误
你在视图中初始化表单时错误地传入了 instance=request.user:
p_form = packageCreateForm(request.POST, instance=request.user)
你的表单 packageCreateForm 关联的模型是 Package,但这里传入的是 User 实例,这会让表单尝试更新当前登录用户的User对象,而不是创建新的Package记录。由于User模型并没有表单中定义的item、description等字段,调用save()时不会产生任何有效的数据库写入操作,这就是数据没保存到数据库的原因。
修复方案
去掉错误的instance参数,在表单验证通过后,手动将当前用户关联到Package的customer字段:
修改后的视图代码:
@login_required def createPackage(request): if request.method == "POST": print(request.POST) # 去掉instance=request.user,创建新的Package表单实例 p_form = packageCreateForm(request.POST) if p_form.is_valid(): # 先不提交到数据库,commit=False返回未保存的Package实例 package = p_form.save(commit=False) # 设置当前用户为该Package的customer package.customer = request.user # 保存到数据库 package.save() x = p_form.cleaned_data.get('pickup_phoneNumber') y = p_form.cleaned_data.get('item') print(x,y) messages.success(request, f'Hi {request.user.username} you have successfully created an order with POST BOX our customer care representative will reach out to you soon ') return redirect('post-box-home') else: print("-----Form is not valid-----") else: p_form = packageCreateForm() return render(request, 'packages/createPackage.html', {'p_form': p_form})
补充说明
commit=False是Django ModelForm的常用技巧,允许我们在保存前修改模型实例的字段(比如这里的外键关联),再执行最终的数据库写入。- 你的Package模型中
customer是必填外键,必须在保存前赋值,否则会触发数据库完整性错误(不过你之前的错误写法绕过了这个步骤,因为根本没在操作Package实例)。
内容的提问来源于stack exchange,提问作者Jephtah Jephtah
相关产品推荐
相关产品推荐

