diff --git a/django/contrib/formtools/tests/models.py b/django/contrib/formtools/tests/models.py new file mode 100644 index 0000000000000..0fad6287c0c2c --- /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/__init__.py b/django/contrib/formtools/tests/wizard/__init__.py index 81de44e65568a..a67e300d71203 100644 --- a/django/contrib/formtools/tests/wizard/__init__.py +++ b/django/contrib/formtools/tests/wizard/__init__.py @@ -16,4 +16,5 @@ WizardTestKwargs, WizardTestGenericViewInterface, WizardFormKwargsOverrideTests, + WizardInlineFormSetTests, ) diff --git a/django/contrib/formtools/tests/wizard/wizardtests/tests.py b/django/contrib/formtools/tests/wizard/wizardtests/tests.py index 3c2dbc3efb117..7d17befcc30a6 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.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): @@ -17,8 +18,8 @@ class Meta: model = User fields = '__all__' - UserFormSet = forms.models.modelformset_factory(User, form=UserForm, extra=2) +PoemFormSet = forms.models.inlineformset_factory(Poet, Poem, fields="__all__") class WizardTests(object): @@ -405,3 +406,24 @@ def get_form_kwargs(self, step): 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): + 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 c91363569941a..c541d4de9e82f 100644 --- a/django/contrib/formtools/wizard/views.py +++ b/django/contrib/formtools/wizard/views.py @@ -406,9 +406,10 @@ def get_form(self, step=None, data=None, files=None): 'prefix': self.get_form_prefix(step, self.form_list[step]), '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. + form_class = self.form_list[step] + 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): # If the form is based on ModelFormSet, add queryset if available