Django request.user 没有在前端显示正确的用户

Django request.user not showing correct user in frontend

当用户使用已在使用的用户名更新个人资料时,会出现“具有该用户名的用户已存在”的消息。但个人资料上的用户名已更改为用户请求的用户名。 例如:如果用户名为 test001 的用户使用已使用的用户名“test0012”更新配置文件

这将会发生:

注意:用户名更新为“test0012”

用户名的前端代码:

<h2 id="user-name" class="account-heading user__name">@{{ user.username }}</h2>

“我的帖子”也会重定向到用户“test0012”的帖子。

个人资料和更新代码:

@login_required
def profile(request):
    if request.method=="POST":
        u_form=UserUpdateForm(request.POST,instance=request.user)#,op_email=request.user.email)
        p_form=ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)

        if u_form.is_valid() and p_form.is_valid():

        
            u_form.save()
            p_form.save()
            messages.success(request,f'Your Account has been updated!')
            
            #changing email on profile
            tusername=u_form.cleaned_data.get('username')
            temail=u_form.cleaned_data.get('email')
            registeruser=User.objects.get(username=tusername)
            registeruser.email=temail
            registeruser.save()
            
            return redirect('profile')
    

    else:
          u_form=UserUpdateForm(instance=request.user)
          p_form=ProfileUpdateForm(instance=request.user.profile)

用户更新表单代码:

class  UserUpdateForm(forms.ModelForm):
    email=forms.EmailField()
    username=forms.CharField(required=True,validators=[username_check,])

    class Meta:
        model =User
        fields =['username','email']

ProfileUpdateForm:

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model=Profile
        fields=['image']

username_check:

def username_check(someusername):
   if someusername!=someusername.lower():
      raise forms.ValidationError("Only Lower case allowed.")

模型表单首先进行自己的清理/验证,然后将此数据分配给您传递给它的实例并调用该实例的 full_clean 方法,这就是错误 A user with that username already exists.但是正如您注意到的那样,这已经太晚了,因为该实例已经 修改了 ,尽管它没有保存到您正在显示相同实例的数据库中。

解决这个问题的方法是从数据库中获取用户实例的副本,只是将其传递给表单,以便与请求关联的实例保持不变和干净:

from django.contrib.auth import get_user_model


UserModel = get_user_model()

@login_required
def profile(request):
    user = UserModel.objects.get(pk=request.user.pk)
    if request.method == "POST":
        u_form = UserUpdateForm(request.POST, instance=user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=user.profile)
        ...
    else:
        u_form = UserUpdateForm(instance=user)
        p_form = ProfileUpdateForm(instance=user.profile)