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)
当用户使用已在使用的用户名更新个人资料时,会出现“具有该用户名的用户已存在”的消息。但个人资料上的用户名已更改为用户请求的用户名。 例如:如果用户名为 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)