Настройка страницы подтверждения удаления выбранного в админке 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
Вернуться на верх