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

Django Admin登录提示“用户名/密码错误”但凭据正确问题求助

Django自定义用户模型下Admin登录提示“用户名或密码错误”的解决办法

嘿,这个问题我之前踩过好几次坑!用自定义用户模型的时候,Admin登录失败大概率是几个常见配置没做好,咱们一步步来解决:

1. 先确认你告诉Django用自定义模型了吗?

这是最容易忽略的一步!如果没在settings.py里配置AUTH_USER_MODEL,Django还是会用默认的User模型,你创建的自定义用户根本不会被Admin登录系统识别到。

在settings.py末尾加上:

# 替换成你的app名称(比如你的模型在名为accounts的app里,就写accounts.UserProfile)
AUTH_USER_MODEL = '你的app名.UserProfile'

注意:这个配置必须在第一次执行迁移命令前就设置,如果已经迁移过数据库,建议清空数据库、删除migrations文件夹下的迁移文件(除了__init__.py),重新执行迁移,不然会有模型冲突的问题。

2. 补全UserProfileManager的超级用户创建方法

看你提供的代码,你的UserProfileManager只有create_user方法,但创建超级用户需要额外的权限字段(比如is_superuser、is_staff),而且必须正确处理密码哈希——直接存明文密码的话,Django登录时会做哈希对比,肯定匹配不上!

完善你的Manager代码:

class UserProfileManager(BaseUserManager):
    """Helps Django work with our custom user model"""
    def create_user(self, email, name, password=None):
        if not email:
            raise ValueError('users must have an email address')
        # 标准化邮箱(把域名转成小写)
        email = self.normalize_email(email)
        user = self.model(email=email, name=name)
        # 必须用set_password来哈希密码,不能直接赋值password!
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name, password):
        """Create and save a new superuser with given details"""
        user = self.create_user(email, name, password)
        # 超级用户需要开启这两个权限
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)
        return user

3. 自定义UserProfile模型要补全必要字段和配置

继承AbstractBaseUser和PermissionsMixin后,你需要指定登录用的字段、必填字段,还要加上is_active、is_staff这些Django Admin需要的权限字段:

class UserProfile(AbstractBaseUser, PermissionsMixin):
    """Represents a user profile inside our system"""
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    # 标记用户是否激活,默认开启
    is_active = models.BooleanField(default=True)
    # 标记用户是否能登录Admin后台,默认关闭
    is_staff = models.BooleanField(default=False)

    objects = UserProfileManager()

    # 指定用email作为登录的唯一标识,替代默认的username
    USERNAME_FIELD = 'email'
    # 创建用户时必须填写的字段(除了email和password)
    REQUIRED_FIELDS = ['name']

    # 以下两个方法是Django要求必须实现的
    def get_full_name(self):
        """Used to get a user's full name"""
        return self.name

    def get_short_name(self):
        """Used to get a user's short name"""
        return self.name

    def __str__(self):
        """Django uses this when converting the object to a string"""
        return self.email

4. 在Admin后台正确注册自定义用户模型

默认的Admin界面是为默认User模型设计的,咱们需要自定义一个Admin类来适配咱们的UserProfile:

在你的app下创建admin.py文件,添加以下代码:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import UserProfile

class UserProfileAdmin(UserAdmin):
    """Customize the admin interface for UserProfile"""
    # 列表页显示的字段
    list_display = ('email', 'name', 'is_staff')
    # 编辑页面的字段分组
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal Info', {'fields': ('name',)}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser')}),
        ('Important dates', {'fields': ('last_login',)}),
    )
    # 添加用户页面的字段
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'name', 'password1', 'password2')
        }),
    )
    # 搜索字段
    search_fields = ('email',)
    # 排序方式
    ordering = ('email',)

# 注册自定义用户模型和对应的Admin类
admin.site.register(UserProfile, UserProfileAdmin)

最后一步:重新创建超级用户

如果之前你创建过超级用户,那大概率是基于默认User模型创建的,现在需要删除旧的超级用户(或者直接清空数据库),然后重新运行命令创建:

python manage.py createsuperuser

输入你的邮箱、姓名和密码,再去Admin后台登录,应该就能正常进入了!

内容的提问来源于stack exchange,提问作者Apurva Geete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:16