summaryrefslogtreecommitdiff
path: root/tests/generic_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 /tests/generic_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 'tests/generic_views')
-rw-r--r--tests/generic_views/forms.py9
-rw-r--r--tests/generic_views/test_edit.py32
-rw-r--r--tests/generic_views/urls.py1
-rw-r--r--tests/generic_views/views.py10
4 files changed, 51 insertions, 1 deletions
diff --git a/tests/generic_views/forms.py b/tests/generic_views/forms.py
index fd8106d1a8..7d07dbc576 100644
--- a/tests/generic_views/forms.py
+++ b/tests/generic_views/forms.py
@@ -15,3 +15,12 @@ class AuthorForm(forms.ModelForm):
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
+
+
+class ConfirmDeleteForm(forms.Form):
+ confirm = forms.BooleanField()
+
+ def clean(self):
+ cleaned_data = super().clean()
+ if 'confirm' not in cleaned_data:
+ raise forms.ValidationError('You must confirm the delete.')
diff --git a/tests/generic_views/test_edit.py b/tests/generic_views/test_edit.py
index ca7c457124..d69ae6463e 100644
--- a/tests/generic_views/test_edit.py
+++ b/tests/generic_views/test_edit.py
@@ -394,3 +394,35 @@ class DeleteViewTests(TestCase):
msg = 'No URL to redirect to. Provide a success_url.'
with self.assertRaisesMessage(ImproperlyConfigured, msg):
self.client.post('/edit/author/%d/delete/naive/' % self.author.pk)
+
+ def test_delete_with_form_as_post(self):
+ res = self.client.get('/edit/author/%d/delete/form/' % self.author.pk)
+ self.assertEqual(res.status_code, 200)
+ self.assertEqual(res.context['object'], self.author)
+ self.assertEqual(res.context['author'], self.author)
+ self.assertTemplateUsed(res, 'generic_views/author_confirm_delete.html')
+ res = self.client.post(
+ '/edit/author/%d/delete/form/' % self.author.pk, data={'confirm': True}
+ )
+ self.assertEqual(res.status_code, 302)
+ self.assertRedirects(res, '/list/authors/')
+ self.assertSequenceEqual(Author.objects.all(), [])
+
+ def test_delete_with_form_as_post_with_validation_error(self):
+ res = self.client.get('/edit/author/%d/delete/form/' % self.author.pk)
+ self.assertEqual(res.status_code, 200)
+ self.assertEqual(res.context['object'], self.author)
+ self.assertEqual(res.context['author'], self.author)
+ self.assertTemplateUsed(res, 'generic_views/author_confirm_delete.html')
+
+ res = self.client.post('/edit/author/%d/delete/form/' % self.author.pk)
+ self.assertEqual(res.status_code, 200)
+ self.assertEqual(len(res.context_data['form'].errors), 2)
+ self.assertEqual(
+ res.context_data['form'].errors['__all__'],
+ ['You must confirm the delete.'],
+ )
+ self.assertEqual(
+ res.context_data['form'].errors['confirm'],
+ ['This field is required.'],
+ )
diff --git a/tests/generic_views/urls.py b/tests/generic_views/urls.py
index e5cb8380d2..940f82d5d0 100644
--- a/tests/generic_views/urls.py
+++ b/tests/generic_views/urls.py
@@ -101,6 +101,7 @@ urlpatterns = [
),
path('edit/author/<int:pk>/delete/', views.AuthorDelete.as_view()),
path('edit/author/<int:pk>/delete/special/', views.SpecializedAuthorDelete.as_view()),
+ path('edit/author/<int:pk>/delete/form/', views.AuthorDeleteFormView.as_view()),
# ArchiveIndexView
path('dates/books/', views.BookArchive.as_view()),
diff --git a/tests/generic_views/views.py b/tests/generic_views/views.py
index 02717333a6..8f3de97388 100644
--- a/tests/generic_views/views.py
+++ b/tests/generic_views/views.py
@@ -4,7 +4,7 @@ from django.urls import reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.views import generic
-from .forms import AuthorForm, ContactForm
+from .forms import AuthorForm, ConfirmDeleteForm, ContactForm
from .models import Artist, Author, Book, BookSigning, Page
@@ -179,6 +179,14 @@ class AuthorDelete(generic.DeleteView):
success_url = '/list/authors/'
+class AuthorDeleteFormView(generic.DeleteView):
+ model = Author
+ form_class = ConfirmDeleteForm
+
+ def get_success_url(self):
+ return reverse('authors_list')
+
+
class SpecializedAuthorDelete(generic.DeleteView):
queryset = Author.objects.all()
template_name = 'generic_views/confirm_delete.html'