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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:30:28