Метод delete_model

Метод delete_model класса ModelAdmin вызывается при удалении объекта из базы данных через интерфейс администратора. Он позволяет выполнить дополнительные действия до или после фактического удаления записи. Метод принимает три параметра: объект запроса request, объект модели obj, который будет удален, и принимает результат выполнения родительского метода. По умолчанию метод просто удаляет объект, но его можно переопределить для добавления дополнительной логики.

Синтаксис

pythonclass MyModelAdmin(admin.ModelAdmin):
  def delete_model(self, request, obj):
    # Дополнительная логика до удаления
    super().delete_model(request, obj)
    # Дополнительная логика после удаления

Пример

Давайте переопределим метод delete_model для вывода информации в консоль перед удалением статьи:

pythonfrom django.contrib import admin
from myapp.models import Article

class ArticleAdmin(admin.ModelAdmin):
  def delete_model(self, request, obj):
    print(f"Deleting article: {obj.title}")
    super().delete_model(request, obj)
    print("Article deleted successfully")

admin.site.register(Article, ArticleAdmin)

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

python"Deleting article: My Article"
"Article deleted successfully"

Пример

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

pythonfrom django.contrib import admin
from django.contrib import messages
from myapp.models import Category

class CategoryAdmin(admin.ModelAdmin):
  def delete_model(self, request, obj):
    if obj.article_set.exists():
      messages.error(
        request,
        f"Cannot delete category '{obj.name}' - it has articles"
      )
    else:
      super().delete_model(request, obj)

admin.site.register(Category, CategoryAdmin)

Результат выполнения кода при попытке удалить категорию со статьями:

python"Cannot delete category 'News' - it has articles"

Пример

Давайте переопределим метод delete_model для логирования информации об удалении в отдельную модель:

pythonfrom django.contrib import admin
from myapp.models import Article, DeletedLog

class ArticleAdmin(admin.ModelAdmin):
  def delete_model(self, request, obj):
    DeletedLog.objects.create(
      title=obj.title,
      deleted_by=request.user,
      deleted_at=timezone.now()
    )
    super().delete_model(request, obj)

admin.site.register(Article, ArticleAdmin)

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

python"Log entry created for deleted article"

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

  • метод save_model,
    который позволяет переопределить сохранение объекта
  • метод get_queryset,
    который изменяет набор объектов в админке
  • метод has_delete_permission,
    который проверяет права на удаление объекта
  • класс ModelAdmin,
    который содержит все методы для настройки админки