Как обратиться или получить доступ к пользовательским разрешениям в `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"]