Метод has_delete_permission
Метод has_delete_permission применяется к классу административной панели, унаследованному от ModelAdmin, и возвращает булево значение, указывающее, имеет ли текущий пользователь право на удаление объектов модели. Метод принимает объект запроса и объект модели (опционально), позволяя гибко настраивать права доступа в зависимости от конкретной ситуации. По умолчанию метод возвращает результат проверки стандартных прав Django, но может быть переопределен для реализации собственной логики.
Синтаксис
class MyModelAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
# Custom logic
return super().has_delete_permission(request, obj)
Метод принимает следующие параметры:
- ⁅b⁆request⁅/b⁆ - объект HTTP-запроса, содержащий информацию о текущем пользователе и сессии;
-
⁅b⁆obj⁅/b⁆ - объект модели, который планируется удалить, либо
Noneпри проверке прав на удаление объектов в списке.
Пример . Использование
Допустим, мы хотим разрешить удаление объектов только суперпользователям. Для этого переопределим метод в нашем классе административной панели:
from django.contrib import admin
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
# Allow deletion only for superusers
if request.user.is_superuser:
return True
return False
Результат выполнения кода:
"True"
Теперь только пользователи с флагом is_superuser смогут удалять статьи через панель администратора.
Пример . С проверкой конкретного объекта
Метод также позволяет выполнять проверку для каждого объекта отдельно. Например, разрешим удаление только тех статей, которые принадлежат текущему пользователю:
from django.contrib import admin
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
# Allow deletion only if the article belongs to the current user
if obj is not None and obj.author == request.user:
return True
return super().has_delete_permission(request, obj)
Результат выполнения кода:
"True"
В этом случае пользователь сможет удалить статью только в том случае, если он является её автором.
Пример . С использованием групп
Разрешим удаление объектов только пользователям, состоящим в группе "Модераторы":
from django.contrib import admin
from django.contrib.auth.models import Group
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
# Allow deletion only for users in the "Moderators" group
if request.user.groups.filter(name="Moderators").exists():
return True
return False
Результат выполнения кода:
"True"
Теперь удаление статей доступно только модераторам.
Смотрите также
-
метод
has_add_permission,
который проверяет права на добавление объектов -
метод
has_change_permission,
который проверяет права на изменение объектов -
метод
delete_model,
который выполняет фактическое удаление объекта -
атрибут
actions,
который определяет доступные массовые действия в списке объектов