diff options
author | Carlton Gibson <carlton.gibson@noumenal.es> | 2021-07-13 16:06:12 +0200 |
---|---|---|
committer | Carlton Gibson <carlton.gibson@noumenal.es> | 2021-07-14 09:47:03 +0200 |
commit | 3a45fea0832c5910acee6e0d29f230f347a50462 (patch) | |
tree | 7d273f954660f9489b03cd0b8ea6c6f202cc9122 /django/views | |
parent | 37e8367c359cd115f109d82f99ff32be219f4928 (diff) | |
download | django-3a45fea0832c5910acee6e0d29f230f347a50462.tar.gz |
Fixed #21936 -- Allowed DeleteView to work with custom Forms and SuccessMessageMixin.
Thanks to Mariusz Felisiak for review.
Co-authored-by: Demetris Stavrou <demestav@gmail.com>
Co-authored-by: Caroline Simpson <github@hoojiboo.com>
Diffstat (limited to 'django/views')
-rw-r--r-- | django/views/generic/edit.py | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py index ccfef9cbcd..d0de788c46 100644 --- a/django/views/generic/edit.py +++ b/django/views/generic/edit.py @@ -1,5 +1,5 @@ from django.core.exceptions import ImproperlyConfigured -from django.forms import models as model_forms +from django.forms import Form, models as model_forms from django.http import HttpResponseRedirect from django.views.generic.base import ContextMixin, TemplateResponseMixin, View from django.views.generic.detail import ( @@ -225,12 +225,30 @@ class DeletionMixin: "No URL to redirect to. Provide a success_url.") -class BaseDeleteView(DeletionMixin, BaseDetailView): +class BaseDeleteView(DeletionMixin, FormMixin, BaseDetailView): """ Base view for deleting an object. Using this base class requires subclassing to provide a response mixin. """ + form_class = Form + + def post(self, request, *args, **kwargs): + # Set self.object before the usual form processing flow. + # Inlined because having DeletionMixin as the first base, for + # get_success_url(), makes leveraging super() with ProcessFormView + # overly complex. + self.object = self.get_object() + form = self.get_form() + if form.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + + def form_valid(self, form): + success_url = self.get_success_url() + self.object.delete() + return HttpResponseRedirect(success_url) class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView): |