我正在使用 Django 5.0.3。我有一个工作列表应用程序,带有一个DeleteListingView。我想重写 delete() 方法,以便在删除列表后我可以使用 messages.success() 向 success url 的模板发送消息。
但是,delete() 方法并未被重写。列表被删除,我被重定向到正确的网址,但消息未发送。我什至尝试在delete()中添加一个print()语句来查看它是否出现在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 %}
我尝试过的任何方法都不起作用,而且我似乎无法在任何地方找到解决方案。我错过了什么?
设置.py:
确保您的
'django.contrib.messages'
中有 INSTALLED_APPS
,中间件设置中有 'django.contrib.messages.middleware.MessageMiddleware'
。
模板:
确保模板中的消息循环周围有
{% if messages %}
。这是为了防止在没有消息的情况下渲染循环。
这是您更新后的模板:
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}