Django 4.2 как отобразить ошибку удаленного объекта на странице modeladmin?

Код, используемый для переопределения delete_queryset в modeladmin:

Этот код корректно отображается для delete_queryset при неудачном удалении. Но когда мы удаляем объект почтового ящика на странице администрирования модели после подтверждения удаления (confirm_delete.html), после возврата на страницу листинга отображаются следующие сообщения:

Не удалось удалить почтовый ящик yy@domain1.net. Обратитесь в службу поддержки

, а также

Почтовый ящик "yy@domain1.net" был успешно удален.

Неудача - это ожидаемый результат. Но почему django также отображает успешное удаление? Как скрыть это сообщение на странице листинга modeladmin для неудачных случаев?

Удаление из набора запросов работает так, как ожидалось. Отображается только сообщение о неудаче

Второе пользовательское сообщение создается в ModelAdmin.response_delete, которое вызывается в ModelAdmin._delete_view после выполнения вашего метода delete_model:

class ModelAdmin(BaseModelAdmin):

    def _delete_view(self, request, object_id, extra_context):
        ...
        if request.POST and not protected:  # The user has confirmed the deletion.
            if perms_needed:
                raise PermissionDenied
            obj_display = str(obj)
            attr = str(to_field) if to_field else self.opts.pk.attname
            obj_id = obj.serializable_value(attr)
            self.log_deletion(request, obj, obj_display)
            self.delete_model(request, obj)  # <--- first user message is created here

            return self.response_delete(request, obj_display, obj_id)  # <--- second message is created here
        ...

    def response_delete(self, request, obj_display, obj_id):
        ...
        self.message_user(
            request,
            _("The %(name)s “%(obj)s” was deleted successfully.")
            % {
                "name": self.opts.verbose_name,
                "obj": obj_display,
            },
            messages.SUCCESS,
        )
        ...

Также обратите внимание, что ответ редиректа, который вы возвращаете в delete_model, здесь игнорируется. Важен только ответ, возвращаемый response_delete.

Вы не увидите второго сообщения, если удаляете из списка изменений, потому что это удаление управляется действием delete_selected, а не delete_view внутри ModelAdmins.

Вернуться на верх