custom django-user object has no attribute 'has_module_perms'

后端 未结 3 1021
刺人心
刺人心 2021-02-12 07:00

My custom user model for login via email:

class MyUser(AbstractBaseUser):
    id = models.AutoField(primary_key=True)  # AutoField?
    is_superuser = models.Int         


        
相关标签:
3条回答
  • 2021-02-12 07:46

    Your User implementation is not providing the mandatory methods to be used with the Admin module.

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

    In your case, add the permissions mixin (PermissionsMixin), as a superclass of your model:

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

    It is described here : https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#custom-users-and-permissions.

    It works with Django 1.x, 2.x and 3.0.

    EDIT: updated links to django version 3.0

    0 讨论(0)
  • 2021-02-12 07:51

    For those who are just stepping in November 2017 and after, I don't think adding or allowing your class to inherit PermissionsMixin is the way out, being that it will raise more error since you have reinvented the wheel.

    I ran into the same problem this afternoon (4th Nov, 2017) having override Username with Phone Number:

    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
    

    So, http://127.0.0.1:8000/admin/ wasn't working and kept raising object has no attribute 'has_module_perms' error, the following is how I fixed mine:

    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
    

    I hope this helps someone.

    0 讨论(0)
  • 2021-02-12 07:58

    I think your model is missing some attributes such as 'has_module_params'...Try to add the following

    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
    
    0 讨论(0)
提交回复
热议问题