Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #21259 -- Fixed formstools wizard for InlineFormSet.

  • Loading branch information...
commit 7e5d7a76bf60564d39d25a101380e47da7f1e2f6 1 parent 9833b93
@flibbertigibbet flibbertigibbet authored timgraham committed
View
26 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
View
24 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):
@@ -19,6 +20,7 @@ class Meta:
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 @@ 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):
+ # 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)
View
13 django/contrib/formtools/wizard/views.py
@@ -398,23 +398,24 @@ def get_form(self, step=None, data=None, files=None):
"""
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):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.