Класс Permission

Класс Permission является моделью, которая хранит информацию о разрешениях в системе Django. Каждое разрешение состоит из трех частей: имя (name), кодовое имя (codename) и ссылка на модель (content_type), к которой оно относится. Разрешения используются для контроля доступа пользователей и групп к определенным действиям в приложении. Обычно разрешения создаются автоматически при создании модели через встроенные операции: добавление, изменение, удаление и просмотр.

Синтаксис

pythonfrom 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
)

Пример

Рассмотрим создание разрешения для модели статьи:

pythonfrom 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)

Результат выполнения кода:

python"can_archive_article"
"Может архивировать статьи"

Пример

Давайте получим все разрешения, связанные с определенной моделью:

pythonfrom 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}")

Результат выполнения кода:

python"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"

Пример

Назначим разрешение пользователю и проверим его наличие:

pythonfrom 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}")

Результат выполнения кода:

python"User has permission: True"

Пример

Проверим разрешения, принадлежащие группе пользователей:

pythonfrom 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}")

Результат выполнения кода:

python"Group permission: change_article"

Смотрите также

  • класс User,
    который представляет пользователя системы
  • класс Group,
    который используется для группировки пользователей и разрешений
  • метод пользователя has_perm,
    который проверяет наличие разрешения у пользователя
  • декоратор permission_required,
    который ограничивает доступ к представлениям