Мне нужен пример has_perm() для AbstractBaseUser в django
У меня есть пользовательская модель пользователя, и мне нужно дать права пользователям с определенными ролями (поля в пользовательской модели), но я не смог найти никаких примеров в интернете, поэтому я спрашиваю примеры у тех, кто делал это раньше. Вот моя абстрактная модель пользователя для справки:
class User(AbstractBaseUser, PermissionsMixin):
class RoleChoices(models.TextChoices):
admin = 'Admin', _('Admin')
cashier = 'Cashier', _('Cashier')
waiter = 'Waiter', _('Waiter')
courier = 'Courier', _('Courier')
customer = 'Customer', _('Customer')
username = models.CharField(_('username'), unique=True, max_length=100)
name = models.CharField(_('name'), max_length=100)
surname = models.CharField(_('surname'), max_length=100)
phone_number = models.CharField(_('phone_number'), max_length=100, null=True, default='Invalid Phone Number')
role = models.CharField(max_length=50, choices=RoleChoices.choices, default=RoleChoices.customer)
active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['name', 'surname']
class Meta:
ordering = ['date_joined', ]
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_active(self):
return self.active
objects = CustomUserManager()
Заранее спасибо, и пожалуйста, извините за любые грамматические ошибки.
Чтобы создать пользовательские разрешения для данного объекта модели, используйте атрибут permissions
класса Meta
.
class User(AbstractBaseUser, PermissionsMixin):
...
class Meta:
permissions = [
("change_role", "Can change the role of user"),
# Others customs permissions if needed
]
Если вы хотите проверить, есть ли у пользователя разрешение на изменение роли, то :
В файле .py user.has_perm('app.change_role')
app - это имя приложения, в котором определена модель.
В файле шаблона (.html)
В переменной шаблона {{ perms }}
хранятся разрешения текущего зарегистрированного пользователя. Используйте ее следующим образом :
{% if perms.app_label.change_role %}
<!-- Show whatever you need here -->
{% endif %}
NB : Это требует включения следующего контекстного процессора: django.contrib.auth.context_processors.auth
Обратите внимание, что если вы вошли в систему как суперпользователь, perms.app_label.foobar
всегда будет истинным, даже если вы неправильно указали имя разрешения.
Также, если вы хотите увидеть все разрешения, которые имеет пользователь из-за групп, в которые он входит, запустите Django shell...
user = User.objects.get(username='somename')
user.get_group_permissions()