From efb0100ee67931329f17bc9988ecd5f0619cea14 Mon Sep 17 00:00:00 2001 From: Anssi Kääriäinen Date: Wed, 30 Oct 2013 21:14:23 +0200 Subject: Fixed #14877 -- repeated deletion using formsets When a formset contained deletion for an existing instance, and the instance was already deleted, django threw an exception. A common cause for this was resubmit of the formset. Original patch by Trac alias olau. In addition this commit cleaned some code in _construct_form(). This was needed as the primary key value the user submitted wasn't converted correctly to python value in case the primary key field was also a related field. --- tests/model_formsets_regress/tests.py | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'tests') diff --git a/tests/model_formsets_regress/tests.py b/tests/model_formsets_regress/tests.py index a79d3744e0..f8a5b7b3ac 100644 --- a/tests/model_formsets_regress/tests.py +++ b/tests/model_formsets_regress/tests.py @@ -454,3 +454,52 @@ class FormfieldShouldDeleteFormTests(TestCase): # verify no "odd" PKs left odd_ids = [user.pk for user in User.objects.all() if user.pk % 2] self.assertEqual(len(odd_ids), 0) + + +class RedeleteTests(TestCase): + def test_resubmit(self): + u = User.objects.create(username='foo', serial=1) + us = UserSite.objects.create(user=u, data=7) + formset_cls = inlineformset_factory(User, UserSite, fields="__all__") + data = { + 'serial': '1', + 'username': 'foo', + 'usersite_set-TOTAL_FORMS': '1', + 'usersite_set-INITIAL_FORMS': '1', + 'usersite_set-MAX_NUM_FORMS': '1', + 'usersite_set-0-id': six.text_type(us.pk), + 'usersite_set-0-data': '7', + 'usersite_set-0-user': 'foo', + 'usersite_set-0-DELETE': '1' + } + formset = formset_cls(data, instance=u) + self.assertTrue(formset.is_valid()) + formset.save() + self.assertEqual(UserSite.objects.count(), 0) + formset = formset_cls(data, instance=u) + # Even if the "us" object isn't in the DB any more, the form + # validates. + self.assertTrue(formset.is_valid()) + formset.save() + self.assertEqual(UserSite.objects.count(), 0) + + def test_delete_already_deleted(self): + u = User.objects.create(username='foo', serial=1) + us = UserSite.objects.create(user=u, data=7) + formset_cls = inlineformset_factory(User, UserSite, fields="__all__") + data = { + 'serial': '1', + 'username': 'foo', + 'usersite_set-TOTAL_FORMS': '1', + 'usersite_set-INITIAL_FORMS': '1', + 'usersite_set-MAX_NUM_FORMS': '1', + 'usersite_set-0-id': six.text_type(us.pk), + 'usersite_set-0-data': '7', + 'usersite_set-0-user': 'foo', + 'usersite_set-0-DELETE': '1' + } + formset = formset_cls(data, instance=u) + us.delete() + self.assertTrue(formset.is_valid()) + formset.save() + self.assertEqual(UserSite.objects.count(), 0) -- cgit v1.3