Fixed #21259 -- Fixed formstools wizard for InlineFormSet.

This commit is contained in:
Kathryn Killebrew 2013-10-11 21:19:27 -04:00 committed by Tim Graham
parent 9833b931b7
commit 7e5d7a76bf
3 changed files with 57 additions and 6 deletions

View File

@ -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 File

@ -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)

View File

@ -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):
"""