whitebear
whitebear

Reputation: 12461

How to use basic deleteview

I start use DeleteView of django.views.generic.

However I am still confused about DeleteView

Document says you don't need to do anything in DeleteView apart from UpdateView,CreateView

So,,,,is this correct??

It doesn't delete the item.

in urls.py

path('preaction/<int:pk>/delete', PreActionDeleteView.as_view(),
     name="pre-action-delete"),

in views.py

class PreActionDeleteView(LoginRequiredMixin, DeleteView):
    model = PreAction
    success_url = reverse_lazy("pre-action-list")

    def delete(self, request, *args, **kwargs):
        success_url = self.get_success_url()
        messages_text = "deleted"
        messages.success(self.request, messages_text)
        return HttpResponseRedirect(success_url)

Upvotes: 0

Views: 276

Answers (2)

NixonSparrow
NixonSparrow

Reputation: 6388

Don't override delete() method. It's much clearer to do such things in form_valid():

from django.contrib.messages.views import SuccessMessageMixin


class BookDeleteView(SuccessMessageMixin, DeleteView):
    model = PreAction
    success_url = reverse_lazy("pre-action-list")

    def form_valid(self, form):
        data_to_return = super().form_valid(form)
        messages_text = "deleted"
        messages.success(self.request, messages_text)
        return data_to_return

Just in case, you usually need to return super() of the method, that is normally in the View.

Also you don't need to use return HttpResponseRedirect(success_url), because it's standard behaviour of DeleteView to redirect to success_url.

Upvotes: 1

Rustam Garayev
Rustam Garayev

Reputation: 2692

Document says you don't need to do anything in DeleteView apart from

Since you are overriding delete() method, you have to delete the specified object manually which in you case is just to call self.object.delete():

def delete(self, request, *args, **kwargs):
    self.object = self.get_object()
    success_url = self.get_success_url()
    self.object.delete()

    messages_text = "deleted"
    messages.success(self.request, messages_text)
    return HttpResponseRedirect(success_url)

To get more information on how things get handled, see this well-structured flow diagram.

Upvotes: 1

Related Questions