为自定义用户模型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
相关产品推荐
相关产品推荐

