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.