Django 2.0改用邮箱登录后,超级用户与普通用户均无法登录
看起来你遇到的核心问题是自定义用户模型没有被Django正确识别,加上错误配置了认证后端,导致两类用户都无法登录。我来一步步帮你解决:
1. 最关键的配置:指定自定义用户模型
你已经自定义了Author继承AbstractUser,但Django默认还是用自带的User模型,必须在settings.py里明确指定:
# settings.py AUTH_USER_MODEL = 'blog_app.Author'
这一步必须做,否则你的自定义模型根本不会被Django的认证系统使用。
2. 修正认证后端配置
你现在用的RemoteUserBackend是给外部系统(比如LDAP、SSO)做远程用户认证用的,完全不适合当前场景。把它改回默认的模型认证后端,同时删掉不需要的中间件:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 删掉这一行:'django.contrib.auth.middleware.RemoteUserMiddleware', ] AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', # 用默认的模型后端 ]
3. 确保自定义用户模型的字段逻辑正确
你的Author模型里,重新定义username为非唯一、空值默认是对的,因为你要用邮箱作为唯一标识。不过有个小细节:AbstractUser本身已经有email字段,你重新定义时设置了unique=True,这符合USERNAME_FIELD = 'email'的要求,没问题。
另外,你的UserManager写得没问题,create_superuser方法也正确设置了is_staff和is_superuser,这部分不用改。
4. 适配后台与前台的登录(CBV实现)
后台登录
当你设置USERNAME_FIELD = 'email'后,Django admin的登录表单会自动接受邮箱作为“用户名”输入,你直接用邮箱和密码登录后台即可,不需要额外修改admin配置。
前台登录(CBV方式)
默认的LoginView用的是AuthenticationForm,它默认显示username输入框,我们需要自定义表单让它显示Email:
# blog_app/forms.py from django.contrib.auth.forms import AuthenticationForm from django import forms class EmailLoginForm(AuthenticationForm): username = forms.EmailField(label='邮箱', widget=forms.EmailInput(attrs={'autofocus': True}))
然后在路由里配置LoginView,指定这个表单:
# 项目urls.py或者blog_app/urls.py from django.contrib.auth.views import LoginView from blog_app.forms import EmailLoginForm urlpatterns = [ # ... 其他路由 path('login/', LoginView.as_view( form_class=EmailLoginForm, template_name='blog_app/login.html' # 你的登录模板路径 ), name='login'), ]
5. 重置数据库与迁移
因为你之前已经创建过数据库,现在修改了核心配置,需要重置迁移:
- 删除
blog_app/migrations/目录下除了__init__.py的所有文件 - 删除数据库文件(比如sqlite3文件)
- 重新运行迁移命令:
python manage.py makemigrations python manage.py migrate
- 重新创建超级用户:
python manage.py createsuperuser(现在会提示你输入邮箱,而不是用户名) - 注册普通用户测试登录
这样操作后,不管是前台普通用户还是后台超级用户,都应该能通过邮箱和密码正常登录了。
内容的提问来源于stack exchange,提问作者Jakub Siwiec

