Django Form校验问题:密码不匹配时模板未展示ValidationError提示
Django密码修改表单错误不展示修复方案
核心问题1:视图层get_form方法重写错误
你重写的get_form方法没有接收默认参数,导致父类方法无法绑定POST请求的提交数据,表单永远处于未绑定状态,不会触发校验逻辑,自然不会返回错误信息。
修复后的views.py代码:
class PasswordsChangeView(FormView): template_name = 'dashboard/password/password_change.html' form_class = ChangePasswordForm success_url = reverse_lazy('dashboard:admin_login') # 保留默认参数form_class def get_form(self, form_class=None): form = super().get_form(form_class) form.set_user(self.request.user) return form
核心问题2:表单clean方法逻辑不严谨
- 你拿到父类返回的
cleaned_data后,最终却返回了self.cleaned_data,可能导致校验后的数据丢失 - 没有先判断两个新密码是否都有值,就直接判断是否相等,空值场景下也会触发无效校验
- 错误只绑定到
new_password1字段,用户如果在确认密码框输入后看不到对应提示 - 原代码缺少旧密码正确性校验,用户随便输入旧密码也能修改密码
修复后的forms.py代码:
class ChangePasswordForm(forms.Form): old_password = forms.CharField( widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '请输入旧密码'})) new_password1 = forms.CharField( widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '请输入新密码'})) new_password2 = forms.CharField( widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '请再次输入新密码'})) def set_user(self, user): self.user = user def clean(self): cleaned_data = super().clean() old_password = cleaned_data.get('old_password') valpwd = cleaned_data.get('new_password1') valrpwd = cleaned_data.get('new_password2') # 校验旧密码是否正确 if old_password and not self.user.check_password(old_password): self.add_error('old_password', '旧密码输入错误') # 两个新密码都有值的情况下再判断是否匹配 if valpwd and valrpwd and valpwd != valrpwd: # 同时给两个新密码字段加错误提示 self.add_error('new_password1', '两次输入的密码不匹配') self.add_error('new_password2', '两次输入的密码不匹配') # 返回父类校验后的cleaned_data return cleaned_data
核心问题3:模板错误展示不全
你只在确认密码区域展示了new_password1的错误,旧密码、新密码字段的错误都没有展示位置,用户看不到对应提示。
修复后的模板代码:
<form method="POST"> {% csrf_token %} <div class="input-group mb-3"> <h6>旧密码</h6>{{form.old_password}} <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> <!-- 旧密码错误提示 --> <span class='form-error'> {{form.errors.old_password}}</span> </div> <div class="input-group mb-3"> <h6>新密码</h6> {{form.new_password1}} <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> <!-- 新密码错误提示 --> <span class='form-error'> {{form.errors.new_password1}}</span> </div> <div class="input-group mb-3"> <h6>确认密码</h6> {{form.new_password2}} <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> <!-- 确认密码错误提示 --> <span class='form-error'> {{form.errors.new_password2}}</span> </div> <button class="btn btn-secondary" type="submit">修改密码</button> </form>
内容的提问来源于stack exchange,提问作者Devi Sunuwar
相关产品推荐
相关产品推荐

