Атрибут permissions
Атрибут permissions класса Group предоставляет доступ к набору разрешений, связанных с группой пользователей. Это поле типа ManyToManyField, которое связывает группу с моделями Permission. Через этот атрибут можно добавлять, удалять и проверять наличие разрешений у группы. Группы используются для централизованного управления правами: вместо назначения разрешений каждому пользователю отдельно, их назначают группе, а пользователей добавляют в эту группу.
Синтаксис
from django.contrib.auth.models import Group, Permission
# Получение группы
group = Group.objects.get(name='moderators')
# Получение всех разрешений группы
permissions = group.permissions.all()
# Добавление разрешения
group.permissions.add(permission)
# Удаление разрешения
group.permissions.remove(permission)
# Очистка всех разрешений
group.permissions.clear()
# Проверка наличия разрешения
has_perm = group.permissions.filter(codename='can_edit_post').exists()
Пример
Создадим группу 'editors' и добавим ей разрешение на публикацию статей:
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article
# Создаем группу
group = Group.objects.create(name='editors')
# Получаем разрешение 'can_publish_article'
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(
content_type=content_type,
codename='can_publish_article'
)
# Добавляем разрешение группе
group.permissions.add(permission)
# Проверяем результат
res = group.permissions.all()
print(res)
Результат выполнения кода:
[<Permission: myapp | article | Can publish article>]
Пример
Проверим наличие нескольких разрешений у группы и удалим одно из них:
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article
# Получаем группу
group = Group.objects.get(name='editors')
# Получаем разрешения
content_type = ContentType.objects.get_for_model(Article)
perm1 = Permission.objects.get(
content_type=content_type,
codename='can_publish_article'
)
perm2 = Permission.objects.get(
content_type=content_type,
codename='can_edit_article'
)
# Добавляем оба разрешения
group.permissions.add(perm1, perm2)
# Проверяем наличие разрешения
has_perm = group.permissions.filter(codename='can_publish_article').exists()
print(f"Has publish permission: {has_perm}")
# Удаляем разрешение
group.permissions.remove(perm1)
# Проверяем снова
has_perm = group.permissions.filter(codename='can_publish_article').exists()
print(f"Has publish permission after removal: {has_perm}")
Результат выполнения кода:
"Has publish permission: True"
"Has publish permission after removal: False"
Пример
Получим список всех кодов разрешений, назначенных группе, для последующей проверки прав пользователей:
from django.contrib.auth.models import Group
# Получаем группу
group = Group.objects.get(name='moderators')
# Получаем все коды разрешений
permission_codes = group.permissions.values_list('codename', flat=True)
# Выводим результат
res = list(permission_codes)
print(res)
Результат выполнения кода:
["can_delete_comment", "can_edit_comment", "can_ban_user"]
Смотрите также
-
атрибут
User.groups,
который предоставляет доступ к группам пользователя -
метод
User.has_perm,
который проверяет наличие разрешения у пользователя -
метод
User.has_perms,
который проверяет наличие нескольких разрешений -
класс
Group,
который предоставляет модель группы пользователей