移除Django密码字段后无法登录管理面板的解决方案求助
解决Django无密码用户模型登录Admin面板的问题
问题根源
Django Admin默认认证流程依赖密码字段,即便你通过set_unusable_password()标记密码不可用,Admin登录表单仍会强制要求输入密码,且默认认证后端会验证密码有效性,导致无密码的超级用户无法登录。
修复步骤
1. 修正自定义User模型
不要显式设置password = None,这会覆盖AbstractBaseUser中的必填密码字段,引发底层逻辑错误。直接删除这一行,保留父类的密码字段,通过set_unusable_password()标记密码不可用即可:
class User(AbstractBaseUser, PermissionsMixin): # 移除 password = None 这一行 phone_number = models.CharField(max_length=25, blank=True, null=True, unique=True) email = models.EmailField(blank=True, null=True, unique=True) name = models.CharField(max_length=255, blank=True, null=True) objects = CustomUserManager() USERNAME_FIELD = 'phone_number' REQUIRED_FIELDS = []
2. 自定义认证后端
创建认证后端,允许Admin登录时仅验证手机号(跳过密码检查),同时限制仅staff/superuser可登录:
在你的app目录下新建backends.py:
from django.contrib.auth.backends import ModelBackend from .models import User class PhoneOnlyAdminBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): # 仅对Admin路径的请求跳过密码验证 if request and request.path.startswith('/admin/'): try: # username对应USERNAME_FIELD即phone_number user = User.objects.get(phone_number=username) # 仅允许staff用户登录Admin if user.is_staff: return user except User.DoesNotExist: return None # 非Admin场景沿用默认认证逻辑 return super().authenticate(request, username, password, **kwargs)
在项目settings.py中配置认证后端:
AUTHENTICATION_BACKENDS = [ 'your_app_name.backends.PhoneOnlyAdminBackend', 'django.contrib.auth.backends.ModelBackend', ]
3. 自定义Admin登录表单(可选,优化体验)
如果希望Admin登录界面不再显示密码输入框,可以自定义登录表单并替换默认Admin站点:
在app的admin.py中:
from django.contrib.admin import AdminSite from django.contrib.admin.forms import AdminAuthenticationForm from django import forms from django.contrib.auth.admin import UserAdmin from .models import User # 自定义登录表单,隐藏密码字段 class PhoneAdminLoginForm(AdminAuthenticationForm): password = forms.CharField(required=False, widget=forms.HiddenInput) # 自定义Admin站点 class CustomAdminSite(AdminSite): login_form = PhoneAdminLoginForm # 初始化自定义站点并注册模型 custom_admin_site = CustomAdminSite(name='custom_admin') custom_admin_site.register(User, UserAdmin)
修改项目urls.py,替换默认Admin路由:
from django.urls import path from your_app_name.admin import custom_admin_site urlpatterns = [ path('admin/', custom_admin_site.urls), # 其他路由... ]
验证
重新创建超级用户(或使用已有的),访问/admin/,输入手机号即可直接登录Admin面板。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

