Django 5迁移PostgreSQL后超级用户无法登录管理后台问题
Django从SQLite迁PostgreSQL后Admin登录提示用户不存在的解决方法
核心问题排查与解决
检查超级用户的
is_active状态
你的CustomUser模型中is_active默认值为False,而Django Admin仅允许is_active=True的用户登录。即便成功创建超级用户,默认禁用状态会让系统判定用户“不存在”。
解决步骤:- 启动Django Shell:
python manage.py shell - 执行代码激活超级用户:
from django.contrib.auth import get_user_model User = get_user_model() # 替换为你创建超级用户时使用的邮箱 user = User.objects.get(email="你的超级用户邮箱") user.is_active = True user.save()
操作完成后重新尝试登录Admin后台。
- 启动Django Shell:
确认登录使用的认证字段
Django Admin默认使用username字段登录,但你的CustomUser模型在save方法中将username设为name的值,若你习惯用邮箱登录会导致失败。如需支持邮箱+用户名双登录,可自定义认证后端:- 在项目根目录创建
backends.py文件,写入以下代码:from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model class EmailBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): UserModel = get_user_model() try: user = UserModel.objects.get(email=username) except UserModel.DoesNotExist: try: user = UserModel.objects.get(username=username) except UserModel.DoesNotExist: return None if user.check_password(password): return user - 在
settings.py中添加认证后端配置:AUTHENTICATION_BACKENDS = [ '你的项目名称.backends.EmailBackend', 'django.contrib.auth.backends.ModelBackend', ]
- 在项目根目录创建
验证超级用户字段完整性
CustomUser模型中user_type为必填字段,创建超级用户时若未指定可能导致数据异常。检查并补全字段:
在Django Shell中执行:from django.contrib.auth import get_user_model User = get_user_model() user = User.objects.get(email="你的超级用户邮箱") # 检查字段值 print(user.user_type, user.is_active, user.username) # 若user_type为空,补充值并保存 if not user.user_type: user.user_type = "manager" # 可替换为你需要的用户类型 user.save()
额外注意事项
- 数据库迁移时,确保自定义用户模型的所有字段在PostgreSQL中同步完整,PostgreSQL对字段约束的检查比SQLite更严格。
- 若业务允许,可将
CustomUser模型中is_active的默认值改为True,避免后续创建用户时重复处理激活状态。
内容的提问来源于stack exchange,提问作者jayC
相关产品推荐
相关产品推荐

