如何重写Django的DeleteView中的delete()方法来发送成功消息?

问题描述 投票:0回答:1

我正在使用 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 %}

我尝试过的任何方法都不起作用,而且我似乎无法在任何地方找到解决方案。我错过了什么?

django django-views django-templates
1个回答
0
投票

设置.py:

确保您的

'django.contrib.messages'
中有
INSTALLED_APPS
,中间件设置中有
'django.contrib.messages.middleware.MessageMiddleware'

模板:

确保模板中的消息循环周围有

{% if messages %} 
。这是为了防止在没有消息的情况下渲染循环。

这是您更新后的模板:

{% if messages %}
    {% for message in messages %}
        <p>{{ message }}</p>
    {% endfor %}
{% endif %}
© www.soinside.com 2019 - 2024. All rights reserved.