Django注册报错:Column 'user_id' cannot be null,fullname未写入users_profile
解决Django注册时Profile表
user_id不能为空的问题 嘿,我来帮你搞定这个问题!咱们先直接找到问题根源,再一步步修正。
问题定位
你遇到的1048, "Column 'user_id' cannot be null"报错,核心原因是Profile实例没有关联到已创建的User对象。你的Profile模型通过OneToOneField和User绑定,要求每个Profile必须对应一个存在的User,但你在保存Profile时,错误地操作了不存在的username字段,而不是关联User实例。
错误代码分析
看你views.py里的这段代码:
profile=profile_form.save(commit=False) profile.username=variable.username # 这里是错误的!Profile模型没有username字段 profile.save()
Profile模型里只有user这个关联字段,没有username字段,所以这段代码完全没给user_id赋值,自然触发了数据库的非空约束报错。
修正后的完整views.py代码
把Profile保存的逻辑改成关联刚创建的User实例即可:
def register(request): if request.method =='POST': form = UserForm(request.POST) profile_form = ProfileForm(request.POST) if form.is_valid() and profile_form.is_valid(): variable=form.save(commit=False) # 这里建议用Django内置的set_password方法,更符合最佳实践 variable.set_password(request.POST['password']) # 原代码的加密方式也可以,但set_password是Django推荐的做法 # variable.password = pbkdf2_sha256.encrypt(request.POST['password'],rounds=12000,salt_size=32) variable.save() # 修正Profile关联逻辑 profile=profile_form.save(commit=False) profile.user = variable # 直接关联刚创建的User对象 profile.save() username = form.cleaned_data.get('username') messages.success(request,f'account created for { username }') return redirect('login') else: form = UserForm() profile_form = ProfileForm() context={'form':form , 'profile_form':profile_form} return render(request, 'users/register.html',context)
额外优化建议
为了避免User创建成功但Profile保存失败导致的数据不一致,建议加上数据库事务,确保两个操作要么都成功,要么都回滚:
from django.db import transaction def register(request): if request.method =='POST': form = UserForm(request.POST) profile_form = ProfileForm(request.POST) if form.is_valid() and profile_form.is_valid(): # 事务包裹,保证数据一致性 with transaction.atomic(): variable=form.save(commit=False) variable.set_password(request.POST['password']) variable.save() profile=profile_form.save(commit=False) profile.user = variable profile.save() username = form.cleaned_data.get('username') messages.success(request,f'account created for { username }') return redirect('login') # 其余代码不变
这样修改后,Profile就能正确关联到User,user_id会自动填充为刚创建的User的ID,报错问题就解决啦。
内容的提问来源于stack exchange,提问作者Ram Patil
相关产品推荐
相关产品推荐

