Как отменить удаление экземпляра модели из интерфейса администрирования модели 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)
Вернуться на верх