Vraag aangepast object django-gebruiker heeft geen kenmerk 'has_module_perms'


Mijn aangepast gebruikersmodel voor inloggen via e-mail:

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'

Waarvoor, ik kan met succes een superuser maken. Wanneer ik echter probeer in te loggen met e-mail en wachtwoord, krijg ik de volgende foutmelding:

'MyUser' object has no attribute 'has_module_perms'

Enig idee wat ik verkeerd doe?


16
2017-07-12 17:05


oorsprong


antwoorden:


Uw gebruikersimplementatie biedt niet de verplichte methoden voor gebruik met de beheerdersmodule.

Zien https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#module-django.contrib.admin.

Voeg in uw geval gewoon de toestemmingsmixin (PermissionsMixin) toe als een superklasse van uw model.

from django.contrib.auth.models import PermissionsMixin


class MyUser(AbstractBaseUser, PermissionsMixin):
     # ...

Het wordt hier beschreven: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissions.


19
2017-07-12 17:23



Ik denk dat je model sommige kenmerken mist zoals 'has_module_params' ... Probeer het volgende toe te voegen

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

8
2017-07-12 17:28



Voor diegenen die net in november 2017 en daarna beginnen, denk ik niet dat het toevoegen of toestaan ​​van je klasse kan erven PermissionsMixin is de uitweg, omdat het meer fouten veroorzaakt, omdat je het wiel opnieuw hebt uitgevonden.

Ik kwam vanmiddag (4 november 2017) hetzelfde probleem tegen met overschrijding Username met 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

Zo, http://127.0.0.1:8000/admin/ werkte niet en bleef verhogen object has no attribute 'has_module_perms' fout, het volgende is hoe ik de mijne heb opgelost:

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

Ik hoop dat dit iemand helpt.


2
2017-11-04 12:15