mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
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.
This commit is contained in:
parent
8faaf03b86
commit
efb0100ee6
2 changed files with 68 additions and 19 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue