自定义 django-user 对象没有属性 'has_module_perms'
custom django-user object has no attribute 'has_module_perms'
我通过电子邮件登录的自定义用户模型:
class MyUser(AbstractBaseUser):
id = models.AutoField(primary_key=True) # AutoField?
is_superuser = models.IntegerField(default=False)
username = models.CharField(unique=True,max_length=30)
first_name = models.CharField(max_length=30, default='')
last_name = models.CharField(max_length=30, default='')
email = models.EmailField(unique=True,max_length=75)
is_staff = models.IntegerField(default=False)
is_active = models.IntegerField(default=False)
date_joined = models.DateTimeField(default=None)
# Use default usermanager
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
class Meta:
db_table = 'auth_user'
为此,我能够成功创建超级用户。但是,当我尝试使用电子邮件和密码登录时,出现此错误:
'MyUser' object has no attribute 'has_module_perms'
知道我做错了什么吗?
您的用户实现没有提供与管理模块一起使用的强制方法。
参见https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#custom-users-and-django-contrib-admin。
在您的情况下,添加权限混合 (PermissionsMixin) 作为模型的超类:
from django.contrib.auth.models import PermissionsMixin
class MyUser(AbstractBaseUser, PermissionsMixin):
# ...
此处描述:https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#custom-users-and-permissions
它适用于 Django 1.x、2.x、3.x 和 4.x。
编辑:更新了指向 django 4.0 版的链接
我认为您的模型缺少某些属性,例如 'has_module_params'...尝试添加以下内容
class MyUser(AbstractBaseUser):
...
...
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
对于那些在 2017 年 11 月及之后才加入的人,我不认为添加或允许您的 class 继承 PermissionsMixin
是出路,因为它会引发更多错误因为你重新发明了轮子。
我 运行 今天下午(2017 年 11 月 4 日)遇到了同样的问题,用 Phone Number
覆盖了 Username
:
class MyUserManager(BaseUserManager):
..
..
def create_superuser(self, phone, password=None):
if password is None:
raise TypeError("provide password please")
myuser = self.model(phone=phone)
myuser.set_password(password)
myuser.is_admin = True
myuser.is_staff = True
myuser.save()
return myuser
因此,http://127.0.0.1:8000/admin/
无法正常工作并不断引发 object has no attribute 'has_module_perms'
错误,以下是我修复我的问题的方法:
class MyUser(AbstractBaseUser):
..
..
def get_full_name(self):
pass
def get_short_name(self):
pass
@property
def is_superuser(self):
return self.is_admin
@property
def is_staff(self):
return self.is_admin
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return self.is_admin
@is_staff.setter
def is_staff(self, value):
self._is_staff = value
我希望这对某人有所帮助。
我通过电子邮件登录的自定义用户模型:
class MyUser(AbstractBaseUser):
id = models.AutoField(primary_key=True) # AutoField?
is_superuser = models.IntegerField(default=False)
username = models.CharField(unique=True,max_length=30)
first_name = models.CharField(max_length=30, default='')
last_name = models.CharField(max_length=30, default='')
email = models.EmailField(unique=True,max_length=75)
is_staff = models.IntegerField(default=False)
is_active = models.IntegerField(default=False)
date_joined = models.DateTimeField(default=None)
# Use default usermanager
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
class Meta:
db_table = 'auth_user'
为此,我能够成功创建超级用户。但是,当我尝试使用电子邮件和密码登录时,出现此错误:
'MyUser' object has no attribute 'has_module_perms'
知道我做错了什么吗?
您的用户实现没有提供与管理模块一起使用的强制方法。
参见https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#custom-users-and-django-contrib-admin。
在您的情况下,添加权限混合 (PermissionsMixin) 作为模型的超类:
from django.contrib.auth.models import PermissionsMixin
class MyUser(AbstractBaseUser, PermissionsMixin):
# ...
此处描述:https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#custom-users-and-permissions
它适用于 Django 1.x、2.x、3.x 和 4.x。
编辑:更新了指向 django 4.0 版的链接
我认为您的模型缺少某些属性,例如 'has_module_params'...尝试添加以下内容
class MyUser(AbstractBaseUser):
...
...
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
对于那些在 2017 年 11 月及之后才加入的人,我不认为添加或允许您的 class 继承 PermissionsMixin
是出路,因为它会引发更多错误因为你重新发明了轮子。
我 运行 今天下午(2017 年 11 月 4 日)遇到了同样的问题,用 Phone Number
覆盖了 Username
:
class MyUserManager(BaseUserManager):
..
..
def create_superuser(self, phone, password=None):
if password is None:
raise TypeError("provide password please")
myuser = self.model(phone=phone)
myuser.set_password(password)
myuser.is_admin = True
myuser.is_staff = True
myuser.save()
return myuser
因此,http://127.0.0.1:8000/admin/
无法正常工作并不断引发 object has no attribute 'has_module_perms'
错误,以下是我修复我的问题的方法:
class MyUser(AbstractBaseUser):
..
..
def get_full_name(self):
pass
def get_short_name(self):
pass
@property
def is_superuser(self):
return self.is_admin
@property
def is_staff(self):
return self.is_admin
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return self.is_admin
@is_staff.setter
def is_staff(self, value):
self._is_staff = value
我希望这对某人有所帮助。