Как обратиться или получить доступ к пользовательским разрешениям в `has_perm()` и `required_permissions`, в Django?

Я хочу знать, как мне указать пользовательские разрешения в методе has_perm() модели User и атрибуте required_permissions класса PermissionRequiredMixin?

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

content_type = ContentType.objects.get_for_model(User)

Permission.objects.create(
                codename='custom_permission',
                name='Custom Permission',
                content_type=content_type,
            )

и предположим, что мое приложение django, в котором я создал это пользовательское разрешение, называется так:

mycustomapp

Как я буду ссылаться/доступаться к этому пользовательскому разрешению в методе has_perm() и атрибуте required_permissions?

Я попробовал следующее для has_perm()

from django.contrib.auth.models import Permission

user = User.objects.all()[0]
user.user_permissions.add(Permission.objects.get(name="Custom Permission"))
user.save()

user.has_perm("mycustomapp.user.custom_permission")

Но это привело к False, вместо True, хотя выполнение user.user_permissions.all() показывает вновь добавленное разрешение

и я попробовал это для атрибута required_permissions:

class CustomView(PermissionRequiredMixin, View):
    required_permission = ["mycustomapp.user_custom_permission"]

Но это не работает, и когда я перехожу к этому представлению на front-end, я получаю Forbidden 403 ошибку, даже если у вошедшего пользователя есть это необходимое разрешение.

Может ли кто-нибудь сказать мне, как я могу ссылаться на пользовательское разрешение в has_perm() и в required_permissions. Пожалуйста, скажите мне, учитывая все детали в точности, как я привел выше в примере.

Ну, я решил это сам, немного поискав и отладив. Итак, в основном has_perm() метод и required_permissions атрибут, следуют следующему синтаксису для разрешения доступа/ссылки:

[django-app-name].[permission-code-name]

Замените [app-name] на имя вашего приложения django и замените `[permission-code-name] на кодовое имя разрешения, на которое вы хотите сослаться или получить доступ. Посмотрите документы по пользовательским разрешениям здесь и примеры разрешений, к которым можно получить доступ/ссылку здесь

Вы можете получить кодовое имя любого разрешения, выполнив следующие действия:

p1 = Permission.objects.all()[0]  # Getting a random permission for this example

p1_code_name = p1.codename  # Getting the code name of the permission

Итак, я решил свою проблему, получив доступ/ссылку на разрешение в методе has_perm() следующим образом:

user = User.objects.all()[0]

user.user_permissions.add(Permission.objects.get(name="Custom Permission"))
user.save()

user.has_perm("mycustomapp.custom_permission")

и в атрибуте required_permissions следующим образом:

class CustomView(PermissionRequiredMixin, View):
    required_permission = ["mycustomapp.custom_permission"]
Вернуться на верх