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

移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:52:47