Commit c0924973 authored by Carl Meyer's avatar Carl Meyer
Browse files

[1.2.X] Fixed #14938 - Fixed save-as-new on inline formset with new forms.

Backport of r15306 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15307 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 131d83b9
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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)
+10 −0
Original line number Diff line number Diff line
@@ -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
+34 −1
Original line number Diff line number Diff line
@@ -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):
@@ -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