Django登录表单问题:凭据正确但表单始终验证失败
Django登录表单问题:凭据正确但表单始终验证失败
嘿,我仔细看了你的代码,发现几个关键问题导致登录表单一直验证失败,咱们一个个拆解来解决:
1. 注册时密码未做哈希存储(最核心问题)
你的SignUp视图里直接把明文密码赋值给UserRegister的password字段保存了,但Django的认证系统是基于哈希密码验证的——明文密码根本过不了后续的authenticate校验。必须用set_password方法来处理密码:
def SignUp(request): if request.method == "POST": form = UserRegisterForm(request.POST) if form.is_valid(): user = UserRegister( username=form.cleaned_data.get('username'), email=form.cleaned_data.get('email') ) # 重点:用set_password对密码进行哈希处理 user.set_password(form.cleaned_data.get('password1')) user.save() messages.success(request, 'Your account has been created!') return HttpResponseRedirect('/Products') else: print("Form is not valid") print(form.errors) else: form = UserRegisterForm() return render(request, 'SignUp.html', {'form': form})
2. 登录表单初始化参数错误
AuthenticationForm(你的UserLoginForm继承自它)的第一个参数必须是request对象,而不是None。错误的初始化方式会导致表单无法正确绑定请求上下文,影响验证逻辑:
# 原来的错误写法 form = UserLoginForm(None,request.POST) # 修正后的写法 form = UserLoginForm(request, request.POST)
3. 登录时密码字段名写错了
在Login视图的authenticate调用里,你用了password1,但你的登录表单里的密码字段明明是password,这会导致取不到正确的密码值:
user = authenticate( request, username=form.cleaned_data.get('username'), # 把password1改成password password=form.cleaned_data.get('password') )
4. 登录表单Meta类字段名拼写错误(非紧急但需修正)
你的UserLoginForm里的Meta类写的是field=['username','password'],应该是复数形式fields,虽然这个不会直接导致验证失败,但属于语法规范问题:
class Meta: model= User fields=['username','password'] # 加个s变成fields
修正后的完整Login视图
def Login(request): if request.method == "POST": # 修正表单初始化方式 form = UserLoginForm(request, request.POST) print(form.is_bound) if form.is_valid(): user = authenticate( request, username=form.cleaned_data.get('username'), # 修正密码字段名 password=form.cleaned_data.get('password') ) if user is not None: login(request, user) return HttpResponseRedirect('/Products') else: form.add_error(None,"Invalid username or password") else: print("Form is not valid") print(form.errors) print(form.non_field_errors()) else: form = UserLoginForm() return render(request, "Login.html", {'form': form})
总结一下:最核心的问题是注册时密码没哈希,导致数据库里存的是明文,后续authenticate用哈希校验肯定不匹配。把上面几个点都修正后,登录应该就能正常工作了。
备注:内容来源于stack exchange,提问作者Hardik Jain
相关产品推荐
相关产品推荐

