我使用django web framework已经有一段时间了,我想写一个自定义的密码更改表单,而不使用django或第三方软件包提供的默认密码。
我尝试过遵循django SetPasswordForm和PasswordChangeForm中使用的类似模式
我的当前实现
项目/应用程序/forms.py
class ChangePasswordForm(forms.Form):
old_password = forms.CharField(max_length=50, )
password1 = forms.CharField(max_length=50, )
password2 = forms.CharField(max_length=50, )
def __init__(self, user, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
def clean(self):
cleaned_data = super().clean()
old_password = cleaned_data.get('old_password')
password1 = cleaned_data.get('password1')
password2 = cleaned_data.get('password2')
# Validate new user password
if password1 and password2 and old_password:
if not self.user.check_password(old_password):
raise ValidationError("Invalid old password, please enter your current password")
elif password1 != password2:
raise ValidationError("Password mismatch, please re-type same password")
password_validation.validate_password(password1, self.user)
return cleaned_data
def save(self, commit=True):
new_password = self.cleaned_data.get('password2')
self.user.set_password(new_password)
if commit:
self.user.save()
return self.user
项目/应用程序/views.py
class ChangePasswordView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
form = ChangePasswordForm(request.user, request.POST)
context = {
'form': form,
}
return render(request, 'auth/change_password.html', context)
def post(self, request, *args, **kwargs):
form = ChangePasswordForm(request.user, request.POST)
if form.is_valid():
user = form.save()
# log user out of all active sessions
update_session_auth_hash(request, user)
messages.success(request, "Password updated successfully")
return redirect('custom_redirect')
return redirect('custom_redirect')
HTML模板渲染
<form class="card-style mb-30" action="{% url 'account_change_password' %}" method="post">
{% csrf_token %}
<h6 class="mb-25">Change Password</h6>
{% if form.errors %}
<div class="text-sm mb-25 alert alert-danger "> <i class="lni lni-close"></i>
<span>{{form.errors}}</span>
</div>
{% for field in form %}
{% for error in field.errors %}
<div class="text-sm mb-25 alert alert-danger "> <i class="lni lni-close"></i>
<span>{{error|escape}}</span>
</div>
{% endfor %}
{% endfor %}
{% endif %}
{% if form.non_field_errors %}
<div class="text-sm mb-25 alert alert-danger "> <i class="lni lni-close"></i>
<span>{{form.non_field_errors}}ghgh </span>
</div>
{% endif %}
<div class="input-style-3">
<input type="password" placeholder="Enter old password" name="old_password" required>
<span class="icon"><i class="lni lni-key"></i></span>
</div>
<div class="input-style-3">
<input type="password" placeholder="Enter new password" name="password1" required>
<span class="icon"><i class="lni lni-key"></i></span>
</div>
<div class="input-style-3">
<input type="password" placeholder="Enter new password again" name="password2" required>
<span class="icon"><i class="lni lni-key"></i></span>
</div>
<div class="col-12">
<div class="button-group d-flex justify-content-center flex-wrap">
<button type="submit" type="submit" class="main-btn primary-btn btn-hover m-2">
Change Password
</button>
</div>
</div>
</form>
我面临的主要问题是表单验证在GET方法上被调用,在尝试随机尝试修复这个问题后,我意识到这个问题是由于我调用Superclass __init __方法的方式造成的。每次我删除super().__init__(*args, **kwargs)
行时,我都会得到一条错误消息,说**'ChangePasswordForm'对象没有属性'_errors'**
请注意,我一直在使用上面示例中的模式将表单渲染到django模板,并且没有遇到任何问题。
2条答案
按热度按时间utugiqy61#
在get()方法中没有表单数据,所以从get()方法中删除request.POST,并在**post()**方法中处理错误。
rxztt3cl2#
将
return redirect('custom_redirect'))
替换为return redirect('custom_redirect')