summaryrefslogtreecommitdiff
path: root/django/views
diff options
context:
space:
mode:
authorCarlton Gibson <carlton.gibson@noumenal.es>2021-07-13 16:06:12 +0200
committerCarlton Gibson <carlton.gibson@noumenal.es>2021-07-14 09:47:03 +0200
commit3a45fea0832c5910acee6e0d29f230f347a50462 (patch)
tree7d273f954660f9489b03cd0b8ea6c6f202cc9122 /django/views
parent37e8367c359cd115f109d82f99ff32be219f4928 (diff)
downloaddjango-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.py22
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):