Как отменить удаление экземпляра модели из интерфейса администрирования модели django на основе некоторого условия
Я хочу прервать удаление модели из админки django на основе некоторого условия.
Я пробовал переопределить delete_queryset(self, request, queryset) метод.
def delete_queryset(self, request, queryset):
if (<my condition>):
message = "Error message"
raise ValidationError(message)
super().delete_queryset(request, queryset)
Это не работает, поскольку django не обрабатывает исключения на этом этапе.
Вы можете переопределить метод .has_delete_permission(…) [Django-doc]:
class MyModelAdmin(ModelAdmin):
# …
def has_delete_permission(self, request, obj=None):
if (my_condition):
return False
return super().has_delete_permission(request, obj)
Здесь obj - это объект, который будет удален. Например, если вы хотите предотвратить удаление объекта с is_active это True, вы можете работать с:
class MyModelAdmin(ModelAdmin):
# …
def has_delete_permission(self, request, obj=None):
if obj is not None and obj.is_active:
return False
return super().has_delete_permission(request, obj)