如何在Django中为无效密码输入显示表单错误提示
Django登录表单密码错误提示修复方案
你的登录表单目前能在用户名无效时显示错误提示,但输入正确用户名+错误密码时,密码字段的错误提示无法正常显示。问题出在clean_password方法的实现上——check_password需要两个参数(明文密码、用户的哈希密码),你只传了一个,而且没有对应到具体用户的密码,导致验证逻辑失效。另外Django自带的AuthenticationForm默认会把认证失败的错误归为非字段错误,不会绑定到password字段,这也是前端无法获取到密码错误的原因。
修复代码(forms.py)
修改LoginForm,重写clean方法来区分用户名错误和密码错误,并将错误绑定到对应字段:
from django import forms from django.contrib.auth import authenticate from django.contrib.auth.forms import AuthenticationForm from .models import User class LoginForm(AuthenticationForm): username = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username', 'required': True})) password = forms.CharField(max_length=255, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password', 'required': True})) def clean(self): cleaned_data = super().clean() username = cleaned_data.get('username') password = cleaned_data.get('password') if username and password: # 先验证用户是否存在 try: user = User.objects.get(username=username) # 用户存在但密码错误时,给password字段添加错误 if not authenticate(username=username, password=password): self.add_error('password', 'Incorrect password') except User.DoesNotExist: # 用户不存在时,给username字段添加错误 self.add_error('username', 'Incorrect username') return cleaned_data
代码说明
- 重写
clean方法,先调用父类的clean完成基础字段验证 - 分情况处理错误:
- 用户不存在:将错误绑定到
username字段 - 用户存在但密码错误:将错误绑定到
password字段
- 用户不存在:将错误绑定到
- 使用
self.add_error()确保错误被关联到对应字段,这样前端就能通过form.password.errors获取到密码错误提示
你的前端login.html代码已经正确渲染了密码字段的错误信息,无需修改。
内容的提问来源于stack exchange,提问作者manuel78
相关产品推荐
相关产品推荐

