2015-07-12 5 views
14

Мой собственный модель пользователя без атрибута «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' 

Любая идея, что я делаю не так?

ответ

16

Реализация вашего пользователя не предоставляет обязательные методы, которые будут использоваться с модулем администратора.

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

В вашем случае просто добавьте permissions mixin (PermissionsMixin), как суперкласс вашей модели.

from django.contrib.auth.models import PermissionsMixin 


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

Здесь описано: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissions.

+0

Спасибо @AdamStarrh, отредактировал мое сообщение, чтобы добавить оператор импорта. – gpichot

+0

Это не работает в новых версиях Django. См. Ответ ниже. –

8

Я думаю, ваша модель не хватает некоторых атрибутов, таких как «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 
+0

Бог чертовски Django. Прошло уже много лет, и им все еще не удалось войти в систему по электронной почте. Какой смысл иметь раковину для кухонной раковины, когда она не делает что-то простое? В общем, это 21-й век, никто больше не хочет входить в систему с именами пользователей. –

0

Для тех, кто только шагая в ноябре 2017 года, и после этого, я не думаю, что добавление или позволяя вашему классу наследовать PermissionsMixin, это выход, поскольку он будет вызывать больше ошибок, поскольку вы изобрели колесо.

Я столкнулся с той же проблемой во второй половине дня (4 ноября 2017 г.), имеющее переопределение Username с 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 

Так, 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 

Надеюсь, это поможет кому-то.

+0

Этот ответ идентичен @Bogdan Goie's. Но вы используете 'is_admin' вместо' is_superuser'. Это потенциально сбивает с толку. –