【问题标题】:custom django-user object has no attribute 'has_module_perms'自定义 django-user 对象没有属性“has_module_perms”
【发布时间】:2015-09-30 22:45:06
【问题描述】:

我通过电子邮件登录的自定义用户模型:

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'

知道我做错了什么吗?

【问题讨论】:

    标签: django django-authentication django-users


    【解决方案1】:

    您的用户实现未提供与管理模块一起使用的强制方法。

    见https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#module-django.contrib.admin。

    在您的情况下,添加权限混合 (PermissionsMixin) 作为模型的超类:

    from django.contrib.auth.models import PermissionsMixin
    
    
    class MyUser(AbstractBaseUser, PermissionsMixin):
         # ...
    

    这里有描述:https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#custom-users-and-permissions。

    它适用于 Django 1.x、2.x 和 3.0。

    编辑:更新了 django 3.0 版的链接

    【讨论】:

    • 感谢@AdamStarrh,编辑了我的帖子以添加导入声明。
    • 这不适用于较新版本的 Django。请参阅下面的答案。
    • 确实如此,在 2.1 确认
    【解决方案2】:

    我认为您的模型缺少一些属性,例如“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
    

    【讨论】:

      【解决方案3】:

      对于那些刚刚在 2017 年 11 月及之后踏入的人,我不认为添加或允许你的类继承 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
      

      我希望这对某人有所帮助。

      【讨论】:

      • 这个答案与@Bogdan Goie 的相同。但是您使用的是is_admin 而不是is_superuser。这可能会令人困惑。
      猜你喜欢
      • 2021-11-21
      • 2016-10-01
      • 2012-11-05
      • 2018-12-25
      • 2016-10-23
      • 1970-01-01
      • 2019-04-15
      • 2017-06-04
      • 1970-01-01
      相关资源
      最近更新 更多