Как переопределить метод delete() в DeleteView в Django, чтобы отправить сообщение об успехе?

Я использую Django 5.0.3. У меня есть приложение для размещения объявлений о работе, в котором есть DeleteListingView. Я хочу переопределить метод delete(), чтобы использовать messages.success() для отправки сообщения в шаблон success url после удаления объявления.

Однако метод delete() не переопределяется. Объявление удаляется, и я перенаправляюсь на правильный url, но сообщение не отправляется. Я даже пытался добавить оператор print() внутри delete(), чтобы посмотреть, появится ли оно в cmd, но оно не появляется.

from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages

from django.urls import reverse_lazy

from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, DeleteView, CreateView

from .models import Listings

class ListingsListView(ListView):
    model = Listings
    template_name = 'listings/listings_list.html'
    context_object_name = 'listings'


class DeleteListingView(LoginRequiredMixin, DeleteView):
    model = Listings
    template_name = 'listings/listing_delete.html'
    context_object_name = 'listing'
    success_url = reverse_lazy('listings')

    def delete(self, request, *args, **kwargs):
        listing = self.get_object()
        listing_title = listing.job_title  

        messages.success(self.request, f"Listing titled '{listing_title}' was deleted successfully.")
        print(f"delete() has been overridden successfully.") # To appear in cmd
        return super().delete(request, *args, **kwargs)

и в шаблоне listings_list.html:

{% for message in messages %}
   <p> {{ message }}</p>
{% endfor %}

Ничто из того, что я пробовал, не работает, и я, похоже, не могу найти решение нигде. Что я упускаю?

Settings.py:

Убедитесь, что у вас есть 'django.contrib.messages' в настройках INSTALLED_APPS, и 'django.contrib.messages.middleware.MessageMiddleware' в настройках MIDDLEWARE.

Шаблон:

Убедитесь, что в вашем шаблоне есть {% if messages %} вокруг цикла сообщений. Это необходимо для того, чтобы предотвратить рендеринг цикла при отсутствии сообщений.

Вот ваш обновленный шаблон:

{% if messages %}
    {% for message in messages %}
        <p>{{ message }}</p>
    {% endfor %}
{% endif %}

Начиная с версии Django 4.0 DeleteView использует метод FormMixin и, следовательно, зависит от метода form_valid. Как следствие, теперь он также поддерживает SuccessMessageMixin, который вы должны использовать:

from django.contrib.messages.views import SuccessMessageMixin


class DeleteListingView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
    model = Listings
    template_name = 'listings/listing_delete.html'
    context_object_name = 'listing'
    success_url = reverse_lazy('listings')
    success_message = "Listing titled '%(title)s' was deleted successfully."
    
    def get_success_message(self, cleaned_data):
        return self.success_message % dict(
            cleaned_data,
            title=self.object.job_title,
        )
Вернуться на верх