django - 如何验证 forms.py 中的旧用户密码 - Django
问题描述
我有一个页面,用户可以在其中更改其帐户密码。我制作了一个密码验证表单,但我不知道如何检查“old_password”字段中的密码是否是真正的旧密码。
class ChangePasswordForm(forms.ModelForm):
password_old = forms.CharField(label="", widget=forms.PasswordInput(attrs={'placeholder': 'Type current password'}))
password1 = forms.CharField(label="", widget=forms.PasswordInput(attrs={'placeholder': 'Type a new password'}))
password2 = forms.CharField(label="", widget=forms.PasswordInput(attrs={'placeholder': 'Confirm password'}))
class Meta:
model = Users
fields = ('password_old', 'password1', 'password2',)
def clean_password1(self):
password1 = self.cleaned_data.get('password1')
try:
validate_password(password1, self.instance)
except forms.ValidationError as error:
self.add_error('password1', error)
return password1
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords didn't match")
return password2
解决方案
如果模型正确Users
实现了AbstractBaseUser
模型,则可以使用.check_password(…)
方法 [Django-doc]:
class ChangePasswordForm(forms.ModelForm):
password_old = forms.CharField(
label='',
widget=forms.PasswordInput(attrs={'placeholder':'Type current password'})
)
password1 = forms.CharField(
label='',
widget=forms.PasswordInput(attrs={'placeholder':'Type a new password'})
)
password2 = forms.CharField(
label='',
widget=forms.PasswordInput(attrs={'placeholder':'Confirm password'})
)
class Meta:
model = Users
fields = ('password',)
def clean_password_old(self):
password_old = self.cleaned_data.get('password_old')
if not self.instance.check_password(password_old):
self.add_error('password_old', 'Password did not match')
return password_old
def clean_password2(self):
password1 = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords didn't match")
return password2
def save(*args, **kwargs):
result = super().save(*args, **kwargs)
self.instance.set_password(self.instance.password)
return result
推荐阅读
- python - Gekko(python) 用于单圈时间优化
- python - 如何将非矩形数组输入到顺序 Keras
- core-data - 如何访问单个核心数据对象
- postgresql - 订阅和激活码的数据库优化
- javascript - NodeJS事件模块关于记录事件模块的基本问题
- flutter - 如何将两个列表合并为一个具有特定顺序的列表?
- graphql - Apollo 缓存本地过滤器和分页
- javascript - 反应路由器dom v5默认路由不起作用
- php - CURL 警告:curl_file_create() 期望参数 1 是有效路径,给定字符串
- spring-boot - 使用 springboot 2.3.3 和 axon 4.4.2 实现轴突快照