Fixed #21259 -- Fixed formstools wizard for InlineFormSet.
This commit is contained in:
parent
9833b931b7
commit
7e5d7a76bf
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue