Commit 7e5d7a76 authored by Kathryn Killebrew's avatar Kathryn Killebrew Committed by Tim Graham
Browse files

Fixed #21259 -- Fixed formstools wizard for InlineFormSet.

parent 9833b931
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
# coding: utf-8
from django.db import models
from django.utils.encoding import python_2_unicode_compatible


@python_2_unicode_compatible
class Poet(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        app_label = 'formtools'

    def __str__(self):
        return self.name


@python_2_unicode_compatible
class Poem(models.Model):
    poet = models.ForeignKey(Poet)
    name = models.CharField(max_length=100)

    class Meta:
        app_label = 'formtools'

    def __str__(self):
        return self.name
+24 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ from django.contrib.auth.models import User
from django.contrib.auth.tests.utils import skipIfCustomUser
from django.contrib.formtools.wizard.views import CookieWizardView
from django.utils._os import upath
from django.contrib.formtools.tests.models import Poet, Poem


class UserForm(forms.ModelForm):
@@ -19,6 +20,7 @@ class UserForm(forms.ModelForm):


UserFormSet = forms.models.modelformset_factory(User, form=UserForm, extra=2)
PoemFormSet = forms.models.inlineformset_factory(Poet, Poem, fields="__all__")


class WizardTests(object):
@@ -405,3 +407,25 @@ class WizardFormKwargsOverrideTests(TestCase):
        self.assertEqual(formset.initial_form_count(), 1)
        self.assertEqual(['staff@example.com'],
            list(formset.queryset.values_list('email', flat=True)))


class WizardInlineFormSetTests(TestCase):
    def setUp(self):
        self.rf = RequestFactory()
        self.poet = Poet.objects.create(name='test')
        self.poem = self.poet.poem_set.create(name='test poem')

    def test_set_instance(self):
        # Regression test for #21259
        poet = self.poet
        class InlineFormSetWizard(CookieWizardView):
            instance = None
            def get_form_instance(self, step):
                if self.instance is None:
                    self.instance = poet
                return self.instance

        view = InlineFormSetWizard.as_view([PoemFormSet])
        response = view(self.rf.get('/'))
        formset = response.context_data['wizard']['form']
        self.assertEqual(formset.instance, self.poet)
+7 −6
Original line number Diff line number Diff line
@@ -398,23 +398,24 @@ class WizardView(TemplateView):
        """
        if step is None:
            step = self.steps.current
        form_class = self.form_list[step]
        # prepare the kwargs for the form instance.
        kwargs = self.get_form_kwargs(step)
        kwargs.update({
            'data': data,
            'files': files,
            'prefix': self.get_form_prefix(step, self.form_list[step]),
            'prefix': self.get_form_prefix(step, form_class),
            'initial': self.get_form_initial(step),
        })
        if issubclass(self.form_list[step], forms.ModelForm):
            # If the form is based on ModelForm, add instance if available
            # and not previously set.
        if issubclass(form_class, (forms.ModelForm, forms.models.BaseInlineFormSet)):
            # If the form is based on ModelForm or InlineFormSet,
            # add instance if available and not previously set.
            kwargs.setdefault('instance', self.get_form_instance(step))
        elif issubclass(self.form_list[step], forms.models.BaseModelFormSet):
        elif issubclass(form_class, forms.models.BaseModelFormSet):
            # If the form is based on ModelFormSet, add queryset if available
            # and not previous set.
            kwargs.setdefault('queryset', self.get_form_instance(step))
        return self.form_list[step](**kwargs)
        return form_class(**kwargs)

    def process_step(self, form):
        """