[Django]-Success_message in DeleteView not shown

68👍

I think this issue in the Django issue tracker should answer your question.

SuccessMessageMixin hooks to form_valid which is not present on DeleteView to push its message to the user.

It also gives an alternative way which works for me:

from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from django.contrib import messages
from .models import Thing

class ThingDelete(DeleteView):
    model = Thing
    success_url = reverse_lazy('list')
    success_message = "Thing was deleted successfully."

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(ThingDelete, self).delete(request, *args, **kwargs)

SuccessMessageMixin was not used in the delete-view (but I do use it for the Create and Update views).
Hopefully this will be improved in later versions of Django (see issue for more info).

👤Heyl1

18👍

The answer by Hel1 is mostly correct, but doesn’t offer a solution for displaying fields within the success message, like this:

success_message = "Session %(name)s was removed successfully"

Simply get the object to be deleted and format the string with the object’s dictionary, like this:

class SessionDeleteView(SuccessMessageMixin, DeleteView):
    model = Session
    success_url = reverse_lazy('session_home')
    success_message = "Session %(name)s was removed successfully"

    def delete(self, request, *args, **kwargs):
        obj = self.get_object()
        messages.success(self.request, self.success_message % obj.__dict__)
        return super(SessionDeleteView, self).delete(request, *args, **kwargs)

5👍

from django.contrib import messages

class LectureDelete( DeleteView):
    model = Lecture

    def get_success_url(self):
        messages.success(self.request, "deleted successfully")
        return reverse("/")

3👍

If you want to overcome the exception problem as in Brett Thomas’s comment, you can update Tocino’s solution in this way:

class SessionDeleteView(SuccessMessageMixin, DeleteView):
model = Session
success_url = reverse_lazy('session_home')
success_message = "Session %(name)s was removed successfully"

def delete(self, request, *args, **kwargs):
    obj = self.get_object()
    data_to_return = super(SessionDeleteView, self).delete(request, *args, **kwargs)
    messages.success(self.request, self.success_message % obj.__dict__)
    return data_to_return

1👍

If using Django 4.0.0 or above the DeleteView can be used together with SuccessMessageMixin as per this Release Note

So in the following example which deletes the a User, the success message is displayed on the account logout page after the User is deleted.

class UserDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
    success_message = _("Your account has been deleted")
    success_url = reverse_lazy('account_logout')

    def get_object(self):
        return self.request.user

Something to watch out for when upgrading from older versions of Django to Django >= 4.0.0

As per the same Release Note: Custom delete logic in delete() handlers should be moved to form_valid(). We has success messages in delete methods which stopped working after the Django 4.0.0 upgrade.

👤garyj

-1👍

It seems like you’re using the messages framework of django in your template but not in your view.

In your view, try adding your success message like this:

from django.contrib import messages

messages.success(request, "Die Veranstaltung wurde gelöscht")
👤dguay

Leave a comment