Как использовать django-guardian в пользовательской модели

Я использую Django-Guardian, чтобы проверить разрешение объекта пользователя. И в моем особом случае я расширил модель пользователя. В моем models.py я расширил пользовательскую модель следующим образом: введите описание изображения здесь

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False) 
    admin = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] # Email & Password are required by default.

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        return self.staff

    @property
    def is_admin(self):
        "Is the user a admin member?"
        return self.admin

    @property
    def is_active(self):
        "Is the user active?"
        return self.active

И в моей объектной модели я добавил Meta класс для разрешения: введите описание изображения здесь

class task(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        permissions = (
            ('view_task', 'View task'),
        )

    def __str__(self):
        return self.name

После выполнения makemigrations и migrate, когда я запускаю тест ниже в python manage.py shell, он всегда вызывает функцию has_perm в моей пользовательской модели и возвращает значение этой функции, которое равно True.

>>>from myapp.models import User, task
>>>setuser = User.objects.get(email = 'joe@gmail.com')
>>>task = exclusionDomain.objects.get(name = 'task1')
>>>setuser.has_perm('view_task', task)

Как мне исправить эту проблему? Или есть полезное руководство по использованию Guardian в пользовательской модели?

1 ответ

Решение

Если у кого есть такая же проблема. Вот решение:

Вместо использования AbstractBaseUser, используйте AbstractUser. AbstractBaseUser не совместим с django-guardian. И согласно документации хранителя, расширенная пользовательская модель, использующая AbstractUser, должна быть в порядке. И это также сработало для меня.

Вот руководство по расширению пользовательской модели с использованием AbstractUser: https://wsvincent.com/django-custom-user-model-tutorial/

Другие вопросы по тегам