#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 /…