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
相关产品推荐
相关产品推荐

