自定义User模型创建超级用户后无法登录Django Admin求助
自定义Accounts模型无法登录Django Admin?看这几个关键点就能解决
我仔细看了你的代码和问题描述,马上发现了一个明显的错误,再结合MongoDB的使用场景,整理出几个必查的修复点:
1. 先搞定超级用户的is_staff字段设置错误
你的MyAccountManager里创建超级用户的代码有个笔误:
user.staff=True # 这里字段名错了!
而你的Accounts模型里对应的字段是is_staff,不是staff!这直接导致你创建的超级用户is_staff还是默认的False,而Django Admin必须要求用户is_staff=True才能登录,这就是你收到错误提示的核心原因之一。
赶紧修改这段代码:
def create_superuser(self, email, username, password): user = self.create_user( email=self.normalize_email(email), password=password, username=username, ) user.is_admin=True user.is_staff=True # 改成is_staff,对应模型字段 user.is_superuser=True user.save(using=self._db) return user
修改后,记得重新创建超级用户:
- 先通过MongoDB客户端删除之前创建的超级用户文档,或者用Django Shell执行删除操作
- 重新运行
python manage.py createsuperuser生成新的超级用户
2. 确认MongoDB的字段存储正确性
因为你用MongoDB代替了默认的SQL数据库,要检查这几点:
- 你用的是
djongo这类适配Django的MongoDB库,且版本和当前Django版本兼容 - 查看MongoDB中超级用户的文档,确认
is_staff、is_admin、is_active这几个字段的值都是true - 确认
password字段存储的是Django标准的哈希值(你的代码里调用了user.set_password(password),这部分是对的,只要没改默认的密码哈希逻辑就没问题)
3. 检查认证后端配置
默认的ModelBackend是支持自定义用户模型的,但为了保险起见,你可以在settings.py里显式指定认证后端:
AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', ]
确保没有其他冲突的认证后端被配置在这里。
4. 自定义Admin登录表单(可选兜底方案)
如果前面的步骤都做了还是有问题,可以自定义Admin的登录表单,强制让它用邮箱作为登录字段:
在accounts/admin.py里添加这段代码:
from django.contrib.admin.forms import AdminAuthenticationForm from django.contrib.auth import get_user_model from django import forms class CustomAdminAuthenticationForm(AdminAuthenticationForm): username = forms.EmailField(label='Email') def clean_username(self): email = self.cleaned_data['username'] User = get_user_model() if not User.objects.filter(email=email).exists(): raise forms.ValidationError('邮箱或密码错误') return email # 替换Admin站点的默认登录表单 from django.contrib import admin admin.site.login_form = CustomAdminAuthenticationForm
完成这些操作后,重启Django服务,用新创建的超级用户邮箱和密码登录,应该就能顺利进入Admin面板了。
内容的提问来源于stack exchange,提问作者orynnnnn
相关产品推荐
相关产品推荐

