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

为自定义用户模型SecurityUser添加Mobile字段失败求助

问题分析

报错IntegrityError: 列"securityman_id"中的空值违反非空约束,核心原因是SecurityUser模型通过OneToOneField关联User,该关联字段为必填项,但你的代码仅创建了User实例,未创建关联的SecurityUser记录,就算尝试保存SecurityUser,也未绑定对应的User,触发了数据库非空约束检查。

当前代码只执行了form.save()生成User,但form2(CustomerForm)完全未执行保存操作,自然不会生成关联的SecurityUser数据;即便你手动保存form2,也没指定关联的User,同样会触发报错。

修复方案

修改registerPage视图逻辑,确保两个表单都通过验证,并且创建SecurityUser时绑定刚生成的User:

def registerPage(request):
    form = CreateUserForm()
    form2 = CustomerForm()
    if request.method == "POST":
        form = CreateUserForm(request.POST, request.FILES)
        form2 = CustomerForm(request.POST, request.FILES)
        # 必须同时验证两个表单,确保输入合法
        if form.is_valid() and form2.is_valid():
            # 保存User实例
            securityman_user = form.save()
            # 先创建SecurityUser对象但不写入数据库,手动绑定关联的User
            security_profile = form2.save(commit=False)
            security_profile.securityman = securityman_user
            security_profile.save()
            
            username = form.cleaned_data.get("username")
            messages.success(request, _("Account was created for ") + username)
            return redirect("login")
    else:
        form = CreateUserForm()
        form2 = CustomerForm()
    context = {"form": form, "form2": form2}
    return render(request, "account/register.html", context)
额外说明
  • 不要注释form2.is_valid(),否则会跳过CustomerForm的输入合法性检查,比如mobile字段的格式验证会失效。
  • form2.save(commit=False)是关键:它会生成SecurityUser对象但暂不写入数据库,等你手动设置securityman关联字段后,再调用save()完成写入,满足数据库的非空约束要求。
  • 你的CustomerForm和SecurityUser模型配置无需修改,已经符合需求。

内容的提问来源于stack exchange,提问作者Khalid Seflan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:12:48