Как переопределить метод 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,
)