You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2.0改用邮箱登录后,超级用户与普通用户均无法登录

解决Django仅邮箱登录的问题

看起来你遇到的核心问题是自定义用户模型没有被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. 重置数据库与迁移

因为你之前已经创建过数据库,现在修改了核心配置,需要重置迁移:

  1. 删除blog_app/migrations/目录下除了__init__.py的所有文件
  2. 删除数据库文件(比如sqlite3文件)
  3. 重新运行迁移命令:
python manage.py makemigrations
python manage.py migrate
  1. 重新创建超级用户:python manage.py createsuperuser(现在会提示你输入邮箱,而不是用户名)
  2. 注册普通用户测试登录

这样操作后,不管是前台普通用户还是后台超级用户,都应该能通过邮箱和密码正常登录了。

内容的提问来源于stack exchange,提问作者Jakub Siwiec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:42