добавить разрешение к модели

#python #django

#python #django

Вопрос:

У меня есть две модели, абстрактный пользователь и администратор, связанные с onetoonefield. Я хочу добавить разрешения для администратора. Я зарегистрировался в мета-разрешениях, но они не сохраняются и не создаются в базе данных. Что мне нужно сделать? Когда я вызываю

 admin.has_perm ('MoveOnApp.register_partner')
  

Я получаю сообщение об ошибке

 'Admin' object has no attribute 'has_perm'
  
 class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """Создал абстрактоного юзера от которого будут унаследованны остальные юзеры"""
    phone_number = models.CharField(
        _('phone number'),
        max_length=14,
        unique=True,
        help_text='Enter your phone number',
    )
    email = models.EmailField(_('email address'), blank=True, unique=True)
    created = models.DateTimeField(_('date joined'), default=datetime.datetime.now())
    USERNAME_FIELD = 'phone_number'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['email']
    objects = BaseManager()
    is_superuser = None

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

class Admin(models.Model):
    """Создаю модель администратора, наследованную от AbstractUser"""
    user = models.OneToOneField(AbstractUser, on_delete=models.CASCADE, primary_key=True)
    company_name = models.CharField(
        _('company name'),
        max_length=150,
    )
    logo_url = models.ImageField(
        upload_to='img/logo'
    )
    first_name = models.CharField(
        _('first name'),
        max_length=50
    )
    last_name = models.CharField(
        _('last name'),
        max_length=50,
    )
    # Флажок, такие права доступа рекомендует делать документация. Есть еще варианты но этот мне кажется самым удобным
    is_admin = models.BooleanField(
        _('admin status'),
        default=True
    )
    objects = BaseManager()

    class Meta:
        permissions = (
            ("register_partner", "Can register partner"),
        )
  

Ответ №1:

Ваша Admin модель — это базовая модель, которая имеет пользователя, но сама не является пользователем, для доступа к ее пользовательским свойствам вам необходимо получить доступ к user атрибуту, например admin.user.has_perm() .

Комментарии:

1. спасибо, не могли бы вы помочь мне еще раз? Я проверил и получил, что register_partner = false . Но разве это не должно быть правдой при создании администратора?

2. Когда вы добавляете разрешение в мета-класс модели, оно добавляет это разрешение только в список разрешений, доступных для этой модели, поэтому, если вы введете в оболочку Permission.objects.filter(content_type__model='admin') , оно появится в списке.

3. Чтобы установить это разрешение для поля пользователя «один к одному», вам необходимо добавить это вновь созданное разрешение к user объекту в вашей Admin модели. Это можно сделать при создании администратора или впоследствии, как кажется в вашем случае. Вот пример программного добавления пользовательских разрешений docs.djangoproject.com/en/3.1/topics/auth/default /…