自定义User模型下createsuperuser无法登录Django管理后台
问题排查与解决
核心原因:超级用户处于未激活状态
你的UserAccount模型中is_active字段默认值是False,调用create_superuser方法时,仅设置了is_admin、is_staff、is_superuser为True,未将is_active设为True。Django认证系统会拒绝未激活用户登录,这是无法进入管理后台的直接原因。
修复步骤
1. 修正create_superuser方法
在UserAccountManager的create_superuser里添加激活设置:
def create_superuser(self, email, username, password): user = self.create_user( email=self.normalize_email(email), username=username, password=password ) user.is_admin = True user.is_staff = True user.is_superuser = True user.is_active = True # 新增这一行,激活用户 user.save(using=self._db) return user
2. 调整last_login字段配置
当前last_login用了auto_now_add=True,该参数仅在用户创建时设置一次登录时间,后续登录不会更新,应改为auto_now=True:
last_login = models.DateTimeField(verbose_name='last_login', auto_now=True)
3. 注册自定义用户到Admin后台(关键遗漏)
Django Admin不会自动识别自定义用户模型,需手动注册。在account应用的admin.py中添加以下代码:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import UserAccount class CustomUserAdmin(UserAdmin): list_display = ('email', 'username', 'date_joined', 'last_login', 'is_admin', 'is_active') search_fields = ('email', 'username') readonly_fields = ('date_joined', 'last_login') fieldsets = ( (None, {'fields': ('email', 'password')}), ('个人信息', {'fields': ('username',)}), ('权限设置', {'fields': ('is_admin', 'is_staff', 'is_superuser', 'is_active')}), ('重要时间', {'fields': ('date_joined', 'last_login')}), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('email', 'username', 'password1', 'password2', 'is_admin', 'is_staff', 'is_superuser', 'is_active')} ), ) ordering = ('email',) admin.site.register(UserAccount, CustomUserAdmin)
4. 激活现有超级用户或重新创建
如果已创建过超级用户,可通过Django Shell手动激活:
python manage.py shell
在Shell中执行:
from account.models import UserAccount user = UserAccount.objects.get(email='你的超级用户邮箱') user.is_active = True user.save()
或删除旧超级用户,用修改后的代码重新创建:
python manage.py createsuperuser
额外注意
- 每次修改模型后,需执行迁移:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者J Adamson
相关产品推荐
相关产品推荐

