2015-07-12 21 views
14

Il mio modello utente personalizzata nessun attributo 'has_module_perms' per l'accesso via e-mail:personalizzato oggetto django-utente ha

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' 

Per cui, io sono in grado di creare con successo un superutente. Tuttavia, quando provo ad accedere con email e password, ottengo questo errore:

'MyUser' object has no attribute 'has_module_perms' 

Qualsiasi idea di cosa sto facendo male?

risposta

16

L'implementazione utente non fornisce i metodi obbligatori da utilizzare con il modulo di amministrazione.

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

Nel tuo caso, aggiungi semplicemente il permesso mixin (PermissionsMixin), come una superclasse del tuo modello.

from django.contrib.auth.models import PermissionsMixin 


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

È descritto qui: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissions.

+0

Grazie a @AdamStarrh, ho modificato il mio post per aggiungere la dichiarazione di importazione. – gpichot

+0

Questo non funziona sulle versioni più recenti di Django. Vedi la risposta qui sotto. –

8

Credo che il vostro modello non è presente alcuni attributi come 'has_module_params' ... tenta di aggiungere il seguente

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

Dio dannato Django. Sono passati anni e non hanno ancora reso facile il login con la posta elettronica. Qual è il punto di avere un quadro del lavello della cucina quando non fa qualcosa di semplice come questo? Comune, è il 21 ° secolo, nessuno vuole più accedere con i nomi utente. –

0

Per coloro che sono appena intensificando nel mese di novembre 2017 e dopo, non credo che l'aggiunta di o consentire alla tua classe di ereditare l'PermissionsMixin è la via d'uscita, in quanto aumenterà più errore da quando hai reinventato la ruota.

Ho incontrato lo stesso problema di questo pomeriggio (4 Novembre 2017) con esclusione Username con 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 

Quindi, http://127.0.0.1:8000/admin/ non funzionava e tenuto alzando object has no attribute 'has_module_perms' errore, il seguente è il modo ho risolto il mio:

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 

Spero che questo aiuti qualcuno.

+0

Questa risposta è identica a quella di @Bogdan Goie. Ma stai usando 'is_admin' invece di' is_superuser'. Questo è potenzialmente confuso. –

Problemi correlati