summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKathryn Killebrew <kathryn.killebrew@gmail.com>2013-10-11 21:19:27 -0400
committerTim Graham <timograham@gmail.com>2013-10-17 14:01:02 -0400
commit7e5d7a76bf60564d39d25a101380e47da7f1e2f6 (patch)
tree47325bae2f2a6a86e17cb7af6aebea9fdaefd452
parent9833b931b78ab3fac33b55873d13769f6dcdb41e (diff)
Fixed #21259 -- Fixed formstools wizard for InlineFormSet.
-rw-r--r--django/contrib/formtools/tests/models.py26
-rw-r--r--django/contrib/formtools/tests/wizard/wizardtests/tests.py24
-rw-r--r--django/contrib/formtools/wizard/views.py13
3 files changed, 57 insertions, 6 deletions
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):
"""