django - 登录的用户信息显示不正确
问题描述
我创建了一个页面来更新用户个人资料。如果我尝试使用现有用户更新用户值,则会按预期抛出错误,但是变量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}
解决方案
作为验证的一部分更新实例的 ModelForm 是奇怪/不需要的行为,也许你发现了一个“错误”
一种解决方法是将request.user
using的副本传递copy.copy
到 ModelForm 中,以便作为验证的一部分所做的任何更改都发生在副本上
user_form = UserUpdateForm(request.POST, instance=copy.copy(request.user))
推荐阅读
- python - Python Jaro–Winkler 相似性循环优化
- mongodb - 带有 Redis 的 Spring Boot 应用程序在启动时插入数据
- objective-c - AVFoundation 框架需要大约 250-300 毫秒来将缓冲区传送到 CaptureOutput。它在渲染时增加延迟
- sql-server - SQL Server 2016 的 h2o 导入表问题
- python - 如何在键盘模块中保持录音直到程序终止
- angular - Angular v5 项目中的生产构建失败 >> 全局 CLI 版本为 6.x
- regex - 使用 Dart 将 PascalCase 字符串分成单独的单词?
- tensorflow - Tensorflow:只有在训练期间将错误最小化,我才能保存检查点?
- python - Python 的函数 update() 无法识别
- python - Python:去掉剩下的单词,只保留第一个单词