Метод delete_model
Метод delete_model класса ModelAdmin вызывается
при удалении объекта из базы данных через интерфейс администратора.
Он позволяет выполнить дополнительные действия до или после
фактического удаления записи. Метод принимает три параметра:
объект запроса request, объект модели obj,
который будет удален, и принимает результат выполнения
родительского метода. По умолчанию метод просто удаляет объект,
но его можно переопределить для добавления дополнительной логики.
Синтаксис
class MyModelAdmin(admin.ModelAdmin):
def delete_model(self, request, obj):
# Дополнительная логика до удаления
super().delete_model(request, obj)
# Дополнительная логика после удаления
Пример
Давайте переопределим метод delete_model для вывода
информации в консоль перед удалением статьи:
from 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)
Результат выполнения кода при удалении статьи:
"Deleting article: My Article"
"Article deleted successfully"
Пример
Давайте переопределим метод delete_model для выполнения
дополнительных действий перед удалением категории, например,
проверим, есть ли связанные статьи:
from 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)
Результат выполнения кода при попытке удалить категорию со статьями:
"Cannot delete category 'News' - it has articles"
Пример
Давайте переопределим метод delete_model для логирования
информации об удалении в отдельную модель:
from 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)
Результат выполнения кода при удалении статьи:
"Log entry created for deleted article"
Смотрите также
-
метод
save_model,
который позволяет переопределить сохранение объекта -
метод
get_queryset,
который изменяет набор объектов в админке -
метод
has_delete_permission,
который проверяет права на удаление объекта -
класс
ModelAdmin,
который содержит все методы для настройки админки