django修改密码功能
功能:
- 旧密码验证
- 输入两次新密码,如果不一致则报错
- 密码必须满足一定的强度
forms.py
class ChangePasswordForm(forms.Form):
"""
修改密码表单
"""
old_password = forms.CharField(label='旧密码', max_length=32, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
password = forms.CharField(label='密码', max_length=32, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
re_password = forms.CharField(label='重复密码', max_length=32, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
def clean(self):
cleaned_data = super().clean()
old_password = cleaned_data.get("old_password")
password = cleaned_data.get("password")
re_password = cleaned_data.get("re_password")
if not authenticate(username=self.user.username, password=old_password):
self.add_error('old_password', '旧密码验证错误')
if password != re_password:
self.add_error('re_password', '两次输入的密码不一致')
try:
validate_password(password, self.user)
except ValidationError as e:
self.add_error('password', e)
return self.cleaned_data
views.py
# 修改密码
def change_password(request):
if request.method == 'POST':
form = ChangePasswordForm(request.POST, user=request.user)
if form.is_valid():
cleanData = form.cleaned_data
request.user.set_password(cleanData['password'])
request.user.save()
messages.success(request, '操作成功!')
return HttpResponseRedirect(reverse(app_name + ':index'))
else:
form = ChangePasswordForm(user=request.user)
return render(request, 'change_password.html', {
'title': "修改密码",
'form': form,
})
change_password.html
<form class="form-horizontal" method="post">
{% csrf_token %}
{% for field in form %}
{% if field.errors %}
<div class="form-group has-error">
{% else %}
<div class="form-group">
{% endif %}
<label class="col-sm-4 control-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="col-sm-8">
{{ field }}
<p class="help-block">{{ field.help_text }}</p>
<p class="help-block">{{ field.errors }}</p>
</div>
</div>
{% endfor %}
<input type="submit" class="btn btn-primary" value="提交">
</form>