Класс Permission
Класс Permission является моделью, которая хранит информацию о разрешениях в системе Django.
Каждое разрешение состоит из трех частей: имя (name), кодовое имя (codename)
и ссылка на модель (content_type), к которой оно относится.
Разрешения используются для контроля доступа пользователей и групп к определенным действиям
в приложении. Обычно разрешения создаются автоматически при создании модели через
встроенные операции: добавление, изменение, удаление и просмотр.
Синтаксис
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
# Создание разрешения
permission = Permission.objects.create(
codename='can_publish_article',
name='Может публиковать статьи',
content_type=content_type
)
Пример
Рассмотрим создание разрешения для модели статьи:
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article
# Получаем ContentType для модели Article
content_type = ContentType.objects.get_for_model(Article)
# Создаем новое разрешение
permission = Permission.objects.create(
codename='can_archive_article',
name='Может архивировать статьи',
content_type=content_type
)
print(permission.codename)
print(permission.name)
Результат выполнения кода:
"can_archive_article"
"Может архивировать статьи"
Пример
Давайте получим все разрешения, связанные с определенной моделью:
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article
# Получаем все разрешения для модели Article
content_type = ContentType.objects.get_for_model(Article)
permissions = Permission.objects.filter(content_type=content_type)
for perm in permissions:
print(f"codename: {perm.codename}, name: {perm.name}")
Результат выполнения кода:
"codename: add_article, name: Can add article"
"codename: change_article, name: Can change article"
"codename: delete_article, name: Can delete article"
"codename: view_article, name: Can view article"
Пример
Назначим разрешение пользователю и проверим его наличие:
from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article
# Получаем пользователя и разрешение
user = User.objects.get(username='john')
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(
codename='can_archive_article',
content_type=content_type
)
# Назначаем разрешение пользователю
user.user_permissions.add(permission)
# Проверяем наличие разрешения
has_perm = user.has_perm('myapp.can_archive_article')
print(f"User has permission: {has_perm}")
Результат выполнения кода:
"User has permission: True"
Пример
Проверим разрешения, принадлежащие группе пользователей:
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')
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.get(
codename='change_article',
content_type=content_type
)
group.permissions.add(permission)
# Получаем все разрешения группы
group_permissions = group.permissions.all()
for perm in group_permissions:
print(f"Group permission: {perm.codename}")
Результат выполнения кода:
"Group permission: change_article"
Смотрите также
-
класс
User,
который представляет пользователя системы -
класс
Group,
который используется для группировки пользователей и разрешений -
метод пользователя
has_perm,
который проверяет наличие разрешения у пользователя -
декоратор
permission_required,
который ограничивает доступ к представлениям