使用自定义User模型无法通过超级用户凭据登录Django Admin
解决自定义User模型无法登录Django Admin的问题
针对你遇到的自定义User模型超级用户无法登录Admin的问题,按以下步骤排查解决:
1. 排查自定义认证后端
你在settings.py中仅配置了自定义的AllAuthBackend作为认证后端,若该后端未正确实现authenticate方法,会直接导致登录失败。
- 临时切换到Django默认认证后端测试:
若切换后能正常登录,说明问题出在你的自定义认证后端上,需检查AUTHENTICATION_BACKENDS = [ # 'project.auth_backend.AllAuthBackend', 'django.contrib.auth.backends.ModelBackend', ]AllAuthBackend的authenticate方法逻辑,确保它能通过邮箱和密码正确验证用户身份。
2. 修正权限方法实现
你重写的has_perm和has_module_perms方法直接返回is_superuser,虽超级用户权限不受影响,但不符合Django权限系统的默认逻辑,可能引发潜在问题。建议删除这两个重写方法,依赖PermissionsMixin提供的默认实现:
# 移除以下两个方法 # def has_perm(self, perm, obj=None): # return self.is_superuser # Modify as needed # def has_module_perms(self, app_label): # return self.is_superuser # Modify as needed
若需自定义权限逻辑,确保方法逻辑符合Django规范,比如has_perm需优先判断超级用户权限,再检查具体权限项。
3. 确认超级用户状态
通过Django Shell验证超级用户的关键字段是否正确:
python manage.py shell
执行以下代码:
from users.models import User user = User.objects.get(email='你的超级用户邮箱') print(user.is_staff, user.is_superuser, user.is_active, user.is_deactivated)
确保输出为True True True False,若字段不符合,更新用户:
user.is_staff = True user.is_superuser = True user.is_active = True user.is_deactivated = False user.save()
4. 在Admin中注册自定义User模型
若未在Admin中注册自定义User模型,Admin无法正确识别并处理用户登录。在users/admin.py中添加以下代码:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import User class CustomUserAdmin(UserAdmin): list_display = ('email', 'name', 'is_staff', 'is_superuser') search_fields = ('email', 'name') ordering = ('email',) fieldsets = ( (None, {'fields': ('email', 'password')}), ('个人信息', {'fields': ('name', 'mobile')}), ('权限设置', {'fields': ('is_active', 'is_staff', 'is_superuser')}), ('时间记录', {'fields': ('created_at', 'deleted_at')}), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('email', 'name', 'mobile', 'password1', 'password2'), }), ) admin.site.register(User, CustomUserAdmin)
5. 清理缓存并重启服务
修改配置和模型后,清理缓存并重启开发服务器,确保所有更改生效:
python manage.py clearcache # 重启你的Django开发服务器
内容的提问来源于stack exchange,提问作者Rohit Pal
相关产品推荐
相关产品推荐

