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

Django自定义Account用户登录admin报无has_module_perms属性如何修复

问题原因

这个报错是因为Django管理后台要求用户模型必须实现has_module_perms、has_perm等权限校验方法,你只继承了AbstractBaseUser的话,这些方法默认是没有的。

修复方案

方案一(推荐):继承PermissionsMixin

django.contrib.auth.models下的PermissionsMixin已经内置了所有管理后台需要的权限校验方法,不需要手动实现,适配性最好也支持后续复杂权限配置。

步骤1:修改自定义用户模型

给你的Account模型新增PermissionsMixin继承:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models
from .managers import MyAccountManajer

class Account(AbstractBaseUser, PermissionsMixin):
    # 你原来定义的字段保持不变
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(max_length=100, unique=True)

    # 必要的状态字段,PermissionsMixin已经自带is_superuser字段,无需额外定义is_superadmin
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    # 配置认证字段
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name']

    # 绑定自定义用户管理器
    objects = MyAccountManajer()

    def __str__(self):
        return self.email

步骤2:修改自定义用户管理器的create_superuser方法

把原来设置is_superadmin的代码改成设置PermissionsMixin自带的is_superuser字段:

def create_superuser(self, first_name, last_name, username, email, password):
    user = self.create_user(
        email = self.normalize_email(email),
        password= password,
        username = username,
        first_name = first_name,
        last_name = last_name,
    )
    user.is_admin = True
    user.is_active = True
    user.is_staff = True
    # 替换原来的is_superadmin设置
    user.is_superuser = True
    user.save(using=self._db)
    return user

步骤3:执行数据库迁移

新增PermissionsMixin会新增权限相关的字段和关联表,需要执行迁移:

python manage.py makemigrations
python manage.py migrate

方案二(轻量场景):手动实现必要的权限方法

如果你不需要Django的整套权限系统,只想让管理后台能正常登录,可以直接在Account模型里手动添加缺失的方法:

class Account(AbstractBaseUser):
    # 你原来的所有字段、配置保持不变

    # 新增两个必要的权限校验方法
    def has_perm(self, perm, obj=None):
        # 只有管理员返回权限校验通过
        return self.is_admin

    def has_module_perms(self, app_label):
        # 只有管理员可以访问对应app的后台模块
        return self.is_admin

这个方案不需要修改数据库,加完方法重启服务即可生效,但不支持后续细粒度的权限配置。

内容的提问来源于stack exchange,提问作者Marcus Aurelius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:54:03