You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法逻辑不严谨

  1. 你拿到父类返回的cleaned_data后,最终却返回了self.cleaned_data,可能导致校验后的数据丢失
  2. 没有先判断两个新密码是否都有值,就直接判断是否相等,空值场景下也会触发无效校验
  3. 错误只绑定到new_password1字段,用户如果在确认密码框输入后看不到对应提示
  4. 原代码缺少旧密码正确性校验,用户随便输入旧密码也能修改密码

修复后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 13:27:01