在不更改密码的情况下保存 Django 用户表单
Saving Django user forms without changing the password
我正在维护一个 Django 应用程序并且遇到了一个错误,如果用户编辑他们的个人资料,那么他们的密码就会被破坏;似乎 set_password 没有被使用,因此密码被设置为一个未加密的值,该值在表单中被硬编码。目前尚不清楚我如何更改现有设置来解决这个问题,欢迎提出任何建议。更新代码如下所示:
@login_required
def profile(request):
user = request.user
profile, created = UserProfile.objects.get_or_create(user=user)
if request.method == 'POST':
userform = UserForm(request.POST, instance=user)
profileform = ProfileForm(request.POST, instance=profile)
if profileform.is_valid():
profileform.save()
if userform.is_valid():
userform.save()
return redirect('user_profile_page')
else:
profileform = ProfileForm(instance=profile)
userform = UserForm(instance=user)
render(request, 'profiles/edit_profile.html', {'profileform': profileform, 'userform': userform})
return render(request, 'profiles/edit_profile.html', {'profileform': profileform, 'userform': userform})
然后,导致问题的用户窗体包含这个看起来很奇怪的代码:
class UserForm(forms.ModelForm):
class Meta:
model = User
exclude = ('last_login', 'date_joined', 'is_active', 'is_superuser', 'is_staff')
username = forms.CharField(widget=forms.TextInput(attrs={'readonly': 'readonly'}))
password = forms.CharField(widget=forms.PasswordInput(attrs={'readonly': 'readonly', 'value': '00000000000000000'}))
我不太确定 password 中的值 attr 是做什么用的。无论如何,我试图通过将以下内容添加到用户窗体来修改它:
def save(self, commit=True):
user = super(UserForm, self).save(commit=False)
password = self.cleaned_data["password"]
if len(password) > 0 and password != '00000000000000000':
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user
我也没有运气,如果我简单地从用户表单或相关的 html 中省略密码字段,那么该表单将无法验证。
<form method="post" action="" class="wide">
{% csrf_token %}
.....
<label for="id_password">Password:</label>
{{ userform.password }}
任何人都可以建议如何清理它吗?
使用单独的表单来编辑密码并将其从这个表单中删除。将 password
添加到 exclude
列表并删除字段声明。
我正在维护一个 Django 应用程序并且遇到了一个错误,如果用户编辑他们的个人资料,那么他们的密码就会被破坏;似乎 set_password 没有被使用,因此密码被设置为一个未加密的值,该值在表单中被硬编码。目前尚不清楚我如何更改现有设置来解决这个问题,欢迎提出任何建议。更新代码如下所示:
@login_required
def profile(request):
user = request.user
profile, created = UserProfile.objects.get_or_create(user=user)
if request.method == 'POST':
userform = UserForm(request.POST, instance=user)
profileform = ProfileForm(request.POST, instance=profile)
if profileform.is_valid():
profileform.save()
if userform.is_valid():
userform.save()
return redirect('user_profile_page')
else:
profileform = ProfileForm(instance=profile)
userform = UserForm(instance=user)
render(request, 'profiles/edit_profile.html', {'profileform': profileform, 'userform': userform})
return render(request, 'profiles/edit_profile.html', {'profileform': profileform, 'userform': userform})
然后,导致问题的用户窗体包含这个看起来很奇怪的代码:
class UserForm(forms.ModelForm):
class Meta:
model = User
exclude = ('last_login', 'date_joined', 'is_active', 'is_superuser', 'is_staff')
username = forms.CharField(widget=forms.TextInput(attrs={'readonly': 'readonly'}))
password = forms.CharField(widget=forms.PasswordInput(attrs={'readonly': 'readonly', 'value': '00000000000000000'}))
我不太确定 password 中的值 attr 是做什么用的。无论如何,我试图通过将以下内容添加到用户窗体来修改它:
def save(self, commit=True):
user = super(UserForm, self).save(commit=False)
password = self.cleaned_data["password"]
if len(password) > 0 and password != '00000000000000000':
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user
我也没有运气,如果我简单地从用户表单或相关的 html 中省略密码字段,那么该表单将无法验证。
<form method="post" action="" class="wide">
{% csrf_token %}
.....
<label for="id_password">Password:</label>
{{ userform.password }}
任何人都可以建议如何清理它吗?
使用单独的表单来编辑密码并将其从这个表单中删除。将 password
添加到 exclude
列表并删除字段声明。