首页 > 解决方案 > 登录的用户信息显示不正确

问题描述

我创建了一个页面来更新用户个人资料。如果我尝试使用现有用户更新用户值,则会按预期抛出错误,但是变量user.username中的变量profile.html显示了我尝试更新的值。我的查询是为什么{{ user.username }}即使未调用 save() 方法也会获取不正确的值。

在此处输入图像描述

profile.html

   <div class="content p-3">
            <div><img class="rounded-circle" src="{{ user.profile.image.url }}" width="100" height="100"></div>
            <div>{{ user.username }}</div>
            <div>{{ user.email }}</div>
        </div>
        <div class="w-25">
            <form method="POST" enctype="multipart/form-data">
                {% csrf_token %}
                <fieldset>
                    <legend>Profile Info</legend>
                    {{ user_form | crispy }}
                    {{ profile_form | crispy }}
                </fieldset>
                <input class="mt-3" type="submit" value="Update">
            </form>
        </div>

表格.py

  class UserUpdateForm(forms.ModelForm):
        email = forms.EmailField()
    
        class Meta:
            model = User
            fields = ['username', 'email']
    

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

视图.py

    @login_required
    def profile(request):
        if (request.method == "POST"):
            user_form = UserUpdateForm(request.POST, instance=request.user)
            profile_form = ProfileUpdateForm(request.POST,
                                             request.FILES,
                                             instance=request.user.profile)
            if (user_form.is_valid() and profile_form.is_valid()):
                user_form.save()
                profile_form.save()
                messages.success(request, f"Your profile is updated successfully")
                return redirect("profile")
            else:
               messages.error(request, f"Failed to update profile")
        else:
            user_form = UserUpdateForm(instance=request.user)
            profile_form = ProfileUpdateForm(instance=request.user.profile)
        return render(request, 'User/profile.html', {'user_form': user_form, 'profile_form': profile_form}

标签: djangodjango-viewsdjango-forms

解决方案


作为验证的一部分更新实例的 ModelForm 是奇怪/不需要的行为,也许你发现了一个“错误”

一种解决方法是将request.userusing的副本传递copy.copy到 ModelForm 中,以便作为验证的一部分所做的任何更改都发生在副本上

user_form = UserUpdateForm(request.POST, instance=copy.copy(request.user))

推荐阅读