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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:06:04