Метод has_delete_permission

Метод has_delete_permission применяется к классу административной панели, унаследованному от ModelAdmin, и возвращает булево значение, указывающее, имеет ли текущий пользователь право на удаление объектов модели. Метод принимает объект запроса и объект модели (опционально), позволяя гибко настраивать права доступа в зависимости от конкретной ситуации. По умолчанию метод возвращает результат проверки стандартных прав Django, но может быть переопределен для реализации собственной логики.

Синтаксис

pythonclass MyModelAdmin(admin.ModelAdmin):
  def has_delete_permission(self, request, obj=None):
    # Custom logic
    return super().has_delete_permission(request, obj)

Метод принимает следующие параметры:

Пример . Использование

Допустим, мы хотим разрешить удаление объектов только суперпользователям. Для этого переопределим метод в нашем классе административной панели:

pythonfrom 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

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

python"True"

Теперь только пользователи с флагом is_superuser смогут удалять статьи через панель администратора.

Пример . С проверкой конкретного объекта

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

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

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

python"True"

В этом случае пользователь сможет удалить статью только в том случае, если он является её автором.

Пример . С использованием групп

Разрешим удаление объектов только пользователям, состоящим в группе "Модераторы":

pythonfrom 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

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

python"True"

Теперь удаление статей доступно только модераторам.

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

  • метод has_add_permission,
    который проверяет права на добавление объектов
  • метод has_change_permission,
    который проверяет права на изменение объектов
  • метод delete_model,
    который выполняет фактическое удаление объекта
  • атрибут actions,
    который определяет доступные массовые действия в списке объектов