Настройка страницы подтверждения удаления выбранного в админке Django
Мне нужно показать дополнительное сообщение о тревоге на странице подтверждения удаления выбранного. Сообщение не должно появляться всегда. Оно должно появляться в зависимости от определенных условий.
Я скопировал шаблон delete_selected_confirmation.html
из каталога django/contrib/admin/templates/admin. Теперь я могу добавить дополнительное тревожное сообщение. Но сообщение должно появляться в зависимости от определенных условий.
Какую функцию внутри class MyModelAdmin(admin.ModelAdmin)
я должен использовать?
Например, чтобы задать контекст для шаблона delete_confirmation.html
, я использую def render_delete_form(self, request, context)
.
Какую функцию следует использовать для шаблона delete_selected_confirmation.html
?
Решением является замена шаблона delete_selected_confirmation.html
, удаление действия delete_selected
, создание собственного действия и использование django.contrib.admin.actions.delete_selected
. Вот схема кода (admin.py
):
from django.contrib import admin
from django.contrib.admin.actions import delete_selected
from django.template.response import TemplateResponse
from django.core.handlers.wsgi import WSGIRequest
from django.db.models import QuerySet
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
actions = ["delete_selected_my_models"]
def get_actions(self, request: WSGIRequest) -> dict:
actions = super().get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
def my_logic_comes_here(
self,
request: WSGIRequest,
series: MyModel,
) -> bool:
# ... My logic comes here
return True
@admin.action(description="Delete selected my models")
def delete_selected_my_models(
self,
request: HttpRequest,
queryset: QuerySet,
) -> TemplateResponse:
template_response = delete_selected(self, request, queryset)
if not request.POST.get("post"):
show_alarm = False
active_my_models = []
for my_model in queryset:
if self.my_logic_comes_here(request, my_model):
show_alarm = True
active_my_models.append(my_model)
template_response.context_data["show_alarm"] = show_alarm
template_response.context_data["active_my_models"] = active_my_models
return template_response