From 7e5d7a76bf60564d39d25a101380e47da7f1e2f6 Mon Sep 17 00:00:00 2001 From: Kathryn Killebrew Date: Fri, 11 Oct 2013 21:19:27 -0400 Subject: [PATCH] Fixed #21259 -- Fixed formstools wizard for InlineFormSet. --- django/contrib/formtools/tests/models.py | 26 +++++++++++++++++++ .../tests/wizard/wizardtests/tests.py | 24 +++++++++++++++++ django/contrib/formtools/wizard/views.py | 13 +++++----- 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 django/contrib/formtools/tests/models.py diff --git a/django/contrib/formtools/tests/models.py b/django/contrib/formtools/tests/models.py new file mode 100644 index 0000000000..bbd540f2dd --- /dev/null +++ b/django/contrib/formtools/tests/models.py @@ -0,0 +1,26 @@ +# 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 diff --git a/django/contrib/formtools/tests/wizard/wizardtests/tests.py b/django/contrib/formtools/tests/wizard/wizardtests/tests.py index 3c2dbc3efb..fbdf7f8ea3 100644 --- a/django/contrib/formtools/tests/wizard/wizardtests/tests.py +++ b/django/contrib/formtools/tests/wizard/wizardtests/tests.py @@ -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) diff --git a/django/contrib/formtools/wizard/views.py b/django/contrib/formtools/wizard/views.py index c913635699..a23a56a37e 100644 --- a/django/contrib/formtools/wizard/views.py +++ b/django/contrib/formtools/wizard/views.py @@ -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): """