Django 1.5: понимание AbstractBaseUser и разрешений

Я создал пользовательское приложение MyUser, которое является расширением AbstractBaseUser. У меня сложилось впечатление, что модель MyUser заменит стандартную Auth.User, если она упоминается в settings.py.

AUTH_PROFILE_MODULE = 'profile.MyUser'

Моя проблема заключается в том, что я не могу установить разрешения для пользователей, зарегистрированных в модели MyUser. Когда я пытаюсь установить членство в группах и разрешения, я получаю сообщение об ошибке User' instance expected, got <MyUser: username>.

Как я могу добавить пользователей моей пользовательской модели в разрешения и правильные группы?

class MyUserManager(BaseUserManager):
    def create_user(self, username, email, phone, password=None, company=False):
        if not email:
            raise ValueError('Users must have an email address')
        if not username: username = email.split('@')[0]
        user = self.model(
            email=MyUserManager.normalize_email(email),
            username=username,phone=phone,)
        user.set_password(password)
        user.save(using=self._db)

        # add to user group and set permissions
        if company: 
            g = Group.objects.get(name='company')
            p = Permission.objects.get(codename='add_company')
        else: 
            g = Group.objects.get(name='user')
            p = Permission.objects.get(codename='add_user')
        g.user_set.add(user)
        user.user_permissions.add(p)
        return user

class MyUser(AbstractBaseUser):
    username = models.CharField(max_length=254, unique=True, blank=True, null=True)
    email = models.EmailField(max_length=254, unique=True, db_index=True)
    phone = models.CharField(_('Phone Number'), max_length=25, blank=True, null=True,)

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['phone']

    objects = MyUserManager()

    def get_full_name(self):
        return self.email
    ...

person neurix    schedule 02.05.2013    source источник


Ответы (2)


Просто добавьте PermissionsMixin к объявлению вашей модели! :)

class MyUser(AbstractBaseUser, PermissionsMixin):
    ...

Вот соответствующая часть документации Django.

person Ivan Kharlamov    schedule 02.05.2013
comment
Как установить уровень группы для пользователя? Когда я устанавливаю его с помощью g.user_set.add(user), я снова получаю TypeError: 'User' instance expected, got <MyUser: username> в качестве сообщения об ошибке. - person neurix; 03.05.2013
comment
Сделайте это с user.groups.add(g). - person Ivan Kharlamov; 03.05.2013

Вы, вероятно, решили свою проблему, но для полноты вы имели в виду настройку AUTH_USER_MODEL и AUTH_PROFILE_MODULE при создании пользовательской модели пользователя в Django 1.5.

ссылка: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#substituting-a-custom-user-model

person Tessa Alexander    schedule 05.11.2013