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

