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

Django登录验证异常求助:输入正确账号密码仍提示错误

Django登录验证失败问题解决

问题分析

输入正确用户名和密码后始终提示认证失败,核心原因有两个:

  1. 自定义的registration模型未集成Django认证系统,authenticate函数仅识别符合Django认证规范的用户模型(自带User或继承AbstractUser/AbstractBaseUser的自定义模型)。
  2. 密码以明文存储,而Django认证系统要求密码必须经过哈希加密,authenticate会自动对输入密码哈希后与数据库值对比,明文无法匹配。

解决方案

方案一:改用Django自带User模型(快速修复)

1. 修改sign_up视图

替换自定义模型为Django自带User模型,并用系统方法加密密码:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User

def home(request):
    return render(request,'home.html')

def log_in(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            return HttpResponse("You have incorrect Username or password")
    return render(request, 'log_in.html')

def sign_up(request):
    if request.method == 'POST':
        name = request.POST.get('fullname')
        username = request.POST.get('username')
        email = request.POST.get('email')
        pass1 = request.POST.get('password')
        pass2 = request.POST.get('confirm_password')

        if pass1 != pass2:
            return HttpResponse("Password not matched")
        else:
            # 使用Django自带User模型创建用户,自动加密密码
            User.objects.create_user(
                username=username,
                email=email,
                password=pass1,
                first_name=name
            )
            return redirect('log_in')
    return render(request,'sign_up.html')

2. 清理旧模型

删除models.py中的registration类,执行迁移更新数据库:

python manage.py makemigrations
python manage.py migrate

方案二:自定义用户模型(适合需扩展用户字段场景)

1. 修改models.py

让自定义模型继承AbstractUser,集成Django认证系统:

from django.db import models
from django.contrib.auth.models import AbstractUser

class registration(AbstractUser):
    Name = models.CharField(max_length=100)
    Email = models.EmailField(max_length=100, unique=True)  # 用EmailField更规范,设为唯一

    # 指定认证用的用户名字段
    USERNAME_FIELD = 'username'
    # 注册时必填的额外字段
    REQUIRED_FIELDS = ['Email', 'Name']

2. 配置settings.py

告诉Django使用自定义用户模型:

AUTH_USER_MODEL = '你的应用名称.registration'  # 替换为实际app名称

注意:该配置必须在首次执行迁移前添加,若已迁移过,建议重置数据库后再执行迁移。

3. 修改sign_up视图

使用自定义模型创建用户,密码自动加密:

def sign_up(request):
    if request.method == 'POST':
        name = request.POST.get('fullname')
        username = request.POST.get('username')
        email = request.POST.get('email')
        pass1 = request.POST.get('password')
        pass2 = request.POST.get('confirm_password')

        if pass1 != pass2:
            return HttpResponse("Password not matched")
        else:
            registration.objects.create_user(
                username=username,
                Email=email,
                Name=name,
                password=pass1
            )
            return redirect('log_in')
    return render(request,'sign_up.html')

4. 执行迁移

python manage.py makemigrations
python manage.py migrate

内容的提问来源于stack exchange,提问作者Mh Limon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:13:24