summaryrefslogtreecommitdiff
path: root/tests/model_formsets_regress
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2013-10-30 21:14:23 +0200
committerAnssi Kääriäinen <akaariai@gmail.com>2013-10-30 22:40:15 +0200
commitefb0100ee67931329f17bc9988ecd5f0619cea14 (patch)
treef9c1a80c4ff0c9f2e0fd01d7354f7dbfbfd0abbc /tests/model_formsets_regress
parent8faaf03b86030f242e35aebd56d9b969c53e7be9 (diff)
downloaddjango-efb0100ee67931329f17bc9988ecd5f0619cea14.tar.gz
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.
Diffstat (limited to 'tests/model_formsets_regress')
-rw-r--r--tests/model_formsets_regress/tests.py49
1 files changed, 49 insertions, 0 deletions
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)