Django提交表单报错NOT NULL constraint failed: account_deal.company_id
问题原因
你遇到的报错是因为提交表单时,Deal模型对应的company字段没有被赋值,触发了数据库的非空约束,核心问题出在视图的表单混用逻辑:
- GET请求阶段你渲染的是
NewDealForm,这个表单的字段列表包含company,你也正确给了初始值 - 但POST请求接收数据时,你用的是
DealForm,查看这个表单的定义可以发现,它的fields配置里没有包含company字段,所以哪怕前端提交了company的参数,这个表单也会直接忽略,保存到数据库时company为空就触发了报错。
你之前删除数据库重新迁移没有效果,是因为这个问题属于业务逻辑错误,和数据库表结构无关,所以这类操作无法解决问题。
修复方案
有两种可选的修复方式,按需选择即可:
方案1:统一使用同一张表单
POST请求阶段也使用NewDealForm接收数据,和你前端渲染的表单结构匹配:
把close_lead视图中POST逻辑里的
deal_form = DealForm(request.POST)
修改为
deal_form = NewDealForm(request.POST)
即可正常接收包含company在内的所有表单字段值。
方案2:手动赋值company字段(更安全)
如果不需要用户修改company值,也可以在表单保存时手动从关联的线索对象里取值赋值,避免前端篡改数据:
修改POST逻辑的表单保存部分:
if deal_form.is_valid(): # 先不提交到数据库 deal = deal_form.save(commit=False) # 获取当前关联的线索对象,取出company字段赋值 project_id = request.GET.get('project_id', '') lead_obj = Leads.objects.get(project_id=project_id) deal.company = lead_obj.company # 再提交到数据库 deal.save() # 后续原有逻辑不变 messages.success(request, 'You have successfully updated the status from open to Close') obj = Leads.objects.get(project_id=project_id) obj.status = "Closed" obj.save(update_fields=['status']) return HttpResponseRedirect(reverse('dashboard'))
补充建议:如果你填充的初始字段(比如project_id、agent、company这些)不希望用户修改,最好在
NewDealForm里将这些字段设置为隐藏或者只读属性,避免用户随意修改提交。
内容的提问来源于stack exchange,提问作者Francisco Colina
相关产品推荐
相关产品推荐

