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.auth.tests.utils import skipIfCustomUser
|
||||||
from django.contrib.formtools.wizard.views import CookieWizardView
|
from django.contrib.formtools.wizard.views import CookieWizardView
|
||||||
from django.utils._os import upath
|
from django.utils._os import upath
|
||||||
|
from django.contrib.formtools.tests.models import Poet, Poem
|
||||||
|
|
||||||
|
|
||||||
class UserForm(forms.ModelForm):
|
class UserForm(forms.ModelForm):
|
||||||
|
@ -19,6 +20,7 @@ class UserForm(forms.ModelForm):
|
||||||
|
|
||||||
|
|
||||||
UserFormSet = forms.models.modelformset_factory(User, form=UserForm, extra=2)
|
UserFormSet = forms.models.modelformset_factory(User, form=UserForm, extra=2)
|
||||||
|
PoemFormSet = forms.models.inlineformset_factory(Poet, Poem, fields="__all__")
|
||||||
|
|
||||||
|
|
||||||
class WizardTests(object):
|
class WizardTests(object):
|
||||||
|
@ -405,3 +407,25 @@ class WizardFormKwargsOverrideTests(TestCase):
|
||||||
self.assertEqual(formset.initial_form_count(), 1)
|
self.assertEqual(formset.initial_form_count(), 1)
|
||||||
self.assertEqual(['staff@example.com'],
|
self.assertEqual(['staff@example.com'],
|
||||||
list(formset.queryset.values_list('email', flat=True)))
|
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:
|
if step is None:
|
||||||
step = self.steps.current
|
step = self.steps.current
|
||||||
|
form_class = self.form_list[step]
|
||||||
# prepare the kwargs for the form instance.
|
# prepare the kwargs for the form instance.
|
||||||
kwargs = self.get_form_kwargs(step)
|
kwargs = self.get_form_kwargs(step)
|
||||||
kwargs.update({
|
kwargs.update({
|
||||||
'data': data,
|
'data': data,
|
||||||
'files': files,
|
'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),
|
'initial': self.get_form_initial(step),
|
||||||
})
|
})
|
||||||
if issubclass(self.form_list[step], forms.ModelForm):
|
if issubclass(form_class, (forms.ModelForm, forms.models.BaseInlineFormSet)):
|
||||||
# If the form is based on ModelForm, add instance if available
|
# If the form is based on ModelForm or InlineFormSet,
|
||||||
# and not previously set.
|
# add instance if available and not previously set.
|
||||||
kwargs.setdefault('instance', self.get_form_instance(step))
|
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
|
# If the form is based on ModelFormSet, add queryset if available
|
||||||
# and not previous set.
|
# and not previous set.
|
||||||
kwargs.setdefault('queryset', self.get_form_instance(step))
|
kwargs.setdefault('queryset', self.get_form_instance(step))
|
||||||
return self.form_list[step](**kwargs)
|
return form_class(**kwargs)
|
||||||
|
|
||||||
def process_step(self, form):
|
def process_step(self, form):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue