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 /tests/generic_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 'tests/generic_views')
-rw-r--r-- | tests/generic_views/forms.py | 9 | ||||
-rw-r--r-- | tests/generic_views/test_edit.py | 32 | ||||
-rw-r--r-- | tests/generic_views/urls.py | 1 | ||||
-rw-r--r-- | tests/generic_views/views.py | 10 |
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' |