Loading django/forms/models.py +0 −4 Original line number Diff line number Diff line Loading @@ -701,10 +701,6 @@ class BaseInlineFormSet(BaseModelFormSet): return 0 return super(BaseInlineFormSet, self).initial_form_count() def total_form_count(self): if self.save_as_new: return super(BaseInlineFormSet, self).initial_form_count() return super(BaseInlineFormSet, self).total_form_count() def _construct_form(self, i, **kwargs): form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs) Loading tests/regressiontests/model_formsets_regress/models.py +10 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,13 @@ class Restaurant(Place): class Manager(models.Model): retaurant = models.ForeignKey(Restaurant) name = models.CharField(max_length=50) class Network(models.Model): name = models.CharField(max_length=15) class Host(models.Model): network = models.ForeignKey(Network) hostname = models.CharField(max_length=25) def __unicode__(self): return self.hostname tests/regressiontests/model_formsets_regress/tests.py +34 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ from django import forms from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory from django.test import TestCase from models import User, UserSite, Restaurant, Manager from models import User, UserSite, Restaurant, Manager, Network, Host class InlineFormsetTests(TestCase): Loading Loading @@ -159,6 +159,39 @@ class InlineFormsetTests(TestCase): form = Form(instance=None) formset = FormSet(instance=None) def test_save_as_new_with_new_inlines(self): """ Existing and new inlines are saved with save_as_new. Regression for #14938. """ efnet = Network.objects.create(name="EFNet") host1 = Host.objects.create(hostname="irc.he.net", network=efnet) HostFormSet = inlineformset_factory(Network, Host) # Add a new host, modify previous host, and save-as-new data = { 'host_set-TOTAL_FORMS': u'2', 'host_set-INITIAL_FORMS': u'1', 'host_set-MAX_NUM_FORMS': u'0', 'host_set-0-id': unicode(host1.id), 'host_set-0-hostname': u'tranquility.hub.dal.net', 'host_set-1-hostname': u'matrix.de.eu.dal.net' } # To save a formset as new, it needs a new hub instance dalnet = Network.objects.create(name="DALnet") formset = HostFormSet(data, instance=dalnet, save_as_new=True) self.assertTrue(formset.is_valid()) formset.save() self.assertQuerysetEqual( dalnet.host_set.order_by("hostname"), ["<Host: matrix.de.eu.dal.net>", "<Host: tranquility.hub.dal.net>"] ) class CustomWidget(forms.CharField): pass Loading Loading
django/forms/models.py +0 −4 Original line number Diff line number Diff line Loading @@ -701,10 +701,6 @@ class BaseInlineFormSet(BaseModelFormSet): return 0 return super(BaseInlineFormSet, self).initial_form_count() def total_form_count(self): if self.save_as_new: return super(BaseInlineFormSet, self).initial_form_count() return super(BaseInlineFormSet, self).total_form_count() def _construct_form(self, i, **kwargs): form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs) Loading
tests/regressiontests/model_formsets_regress/models.py +10 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,13 @@ class Restaurant(Place): class Manager(models.Model): retaurant = models.ForeignKey(Restaurant) name = models.CharField(max_length=50) class Network(models.Model): name = models.CharField(max_length=15) class Host(models.Model): network = models.ForeignKey(Network) hostname = models.CharField(max_length=25) def __unicode__(self): return self.hostname
tests/regressiontests/model_formsets_regress/tests.py +34 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ from django import forms from django.forms.models import modelform_factory, inlineformset_factory, modelformset_factory from django.test import TestCase from models import User, UserSite, Restaurant, Manager from models import User, UserSite, Restaurant, Manager, Network, Host class InlineFormsetTests(TestCase): Loading Loading @@ -159,6 +159,39 @@ class InlineFormsetTests(TestCase): form = Form(instance=None) formset = FormSet(instance=None) def test_save_as_new_with_new_inlines(self): """ Existing and new inlines are saved with save_as_new. Regression for #14938. """ efnet = Network.objects.create(name="EFNet") host1 = Host.objects.create(hostname="irc.he.net", network=efnet) HostFormSet = inlineformset_factory(Network, Host) # Add a new host, modify previous host, and save-as-new data = { 'host_set-TOTAL_FORMS': u'2', 'host_set-INITIAL_FORMS': u'1', 'host_set-MAX_NUM_FORMS': u'0', 'host_set-0-id': unicode(host1.id), 'host_set-0-hostname': u'tranquility.hub.dal.net', 'host_set-1-hostname': u'matrix.de.eu.dal.net' } # To save a formset as new, it needs a new hub instance dalnet = Network.objects.create(name="DALnet") formset = HostFormSet(data, instance=dalnet, save_as_new=True) self.assertTrue(formset.is_valid()) formset.save() self.assertQuerysetEqual( dalnet.host_set.order_by("hostname"), ["<Host: matrix.de.eu.dal.net>", "<Host: tranquility.hub.dal.net>"] ) class CustomWidget(forms.CharField): pass Loading