更新用户时出现‘AnonymousUser object has no attribute _meta’错误求助
我在应用中更新用户信息时遇到了错误,排查后发现问题出在
form = TeamMembersFormUpdate(data=request.POST, instance=request.user)这一行。相关代码如下:
def CandidateSignIn(request, uidb64, token): try: uid = force_text(urlsafe_base64_decode(uidb64)) user = MyUser.objects.get(pk=uid) except(TypeError, ValueError, OverflowError, User.DoesNotExist): user = None if user is not None and account_activation_token.check_token(user, token): user.is_active = True user.save() login(request, user) registered = False if request.method == "POST": form = TeamMembersFormUpdate(data=request.POST, instance=request.user) if form.is_valid(): user = form.save() user.set_password(user.password) user.save() #registered = True return HttpResponseRedirect(reverse('registration:HRlogin')) else: print("Error!") else: form = TeamMembersFormUpdate() return render(request,'candidateSignIn.html', {'form':form, 'registered':registered})
我来帮你梳理几个大概率的问题点和对应的解决办法:
检查表单与用户模型的关联
首先确认TeamMembersFormUpdate这个表单类的Meta是否正确关联到了你的MyUser模型。如果表单绑定的是其他模型(比如单独的TeamMember模型),用request.user(MyUser实例)作为instance传入肯定会报错。你需要确保表单的定义是这样的:class TeamMembersFormUpdate(forms.ModelForm): class Meta: model = MyUser # 这里必须和你的自定义用户模型一致 fields = ['username', 'email', '你的其他字段'] # 匹配模型中的字段确认request.user的实例类型
虽然你已经执行了login(request, user),但偶尔会出现认证后端返回的用户类型不匹配的情况。可以在初始化表单前加一行调试代码确认:print(type(request.user)) # 查看输出是否是你定义的MyUser类如果输出不是
MyUser,需要检查你的认证配置,确保AUTH_USER_MODEL指向了自定义的MyUser模型。调整表单初始化的参数写法
Django的ModelForm初始化时,参数顺序不影响,但显式传递instance参数能避免一些隐性问题,建议改成:form = TeamMembersFormUpdate(instance=request.user, data=request.POST)核对表单字段与模型字段的匹配性
如果表单里定义了模型不存在的字段,或者字段类型不匹配(比如模型是CharField,表单用了IntegerField),也会在初始化阶段报错。仔细检查表单的字段名称、类型是否和MyUser模型完全对应,有没有拼写错误。
另外提个小建议:你代码里的user.set_password(user.password)这行有点多余——如果只是想保存用户的其他信息,不需要重新设置密码,这行代码会把现有密码再次哈希,导致用户原密码失效;如果是要修改密码,应该从表单的清理数据里取新密码,比如user.set_password(form.cleaned_data['password'])。
内容的提问来源于stack exchange,提问作者Ben2pop

