Merge pull request #943 from stephrdev/trac-19433

Fixed #19433 -- Added some class attributes to pass initial form lists to the WizardView.
This commit is contained in:
Jannis Leidel 2013-03-23 05:23:02 -07:00
commit f2c55d2ee1
3 changed files with 67 additions and 10 deletions

View File

@ -78,6 +78,12 @@ class TestWizard(WizardView):
kwargs['test'] = True kwargs['test'] = True
return kwargs return kwargs
class TestWizardWithInitAttrs(TestWizard):
form_list = [Step1, Step2]
condition_dict = {'step2': True}
initial_dict = {'start': {'name': 'value1'}}
instance_dict = {'start': User()}
class FormTests(TestCase): class FormTests(TestCase):
def test_form_init(self): def test_form_init(self):
testform = TestWizard.get_initkwargs([Step1, Step2]) testform = TestWizard.get_initkwargs([Step1, Step2])
@ -91,6 +97,9 @@ class FormTests(TestCase):
self.assertEqual( self.assertEqual(
testform['form_list'], {'0': Step1, '1': Step2, 'finish': Step3}) testform['form_list'], {'0': Step1, '1': Step2, 'finish': Step3})
testform = TestWizardWithInitAttrs.get_initkwargs()
self.assertEqual(testform['form_list'], {'0': Step1, '1': Step2})
def test_first_step(self): def test_first_step(self):
request = get_request() request = get_request()
@ -132,6 +141,11 @@ class FormTests(TestCase):
response, instance = testform(request) response, instance = testform(request)
self.assertEqual(instance.get_next_step(), 'step3') self.assertEqual(instance.get_next_step(), 'step3')
testform = TestWizardWithInitAttrs.as_view(
[('start', Step1), ('step2', Step2), ('step3', Step3)])
response, instance = testform(request)
self.assertEqual(instance.get_next_step(), 'step2')
def test_form_kwargs(self): def test_form_kwargs(self):
request = get_request() request = get_request()
@ -162,6 +176,13 @@ class FormTests(TestCase):
self.assertEqual(instance.get_form_initial('start'), {'name': 'value1'}) self.assertEqual(instance.get_form_initial('start'), {'name': 'value1'})
self.assertEqual(instance.get_form_initial('step2'), {}) self.assertEqual(instance.get_form_initial('step2'), {})
testform = TestWizardWithInitAttrs.as_view(
[('start', Step1), ('step2', Step2)])
response, instance = testform(request)
self.assertEqual(instance.get_form_initial('start'), {'name': 'value1'})
self.assertEqual(instance.get_form_initial('step2'), {})
def test_form_instance(self): def test_form_instance(self):
request = get_request() request = get_request()
the_instance = TestModel() the_instance = TestModel()
@ -176,6 +197,14 @@ class FormTests(TestCase):
instance.get_form_instance('non_exist_instance'), instance.get_form_instance('non_exist_instance'),
None) None)
testform = TestWizardWithInitAttrs.as_view(
[('start', TestModelForm), ('step2', Step2)])
response, instance = testform(request)
self.assertEqual(
instance.get_form_instance('start'),
TestWizardWithInitAttrs.instance_dict['start'])
def test_formset_instance(self): def test_formset_instance(self):
request = get_request() request = get_request()
the_instance1, created = TestModel.objects.get_or_create( the_instance1, created = TestModel.objects.get_or_create(

View File

@ -120,7 +120,7 @@ class WizardView(TemplateView):
return super(WizardView, cls).as_view(**initkwargs) return super(WizardView, cls).as_view(**initkwargs)
@classmethod @classmethod
def get_initkwargs(cls, form_list, initial_dict=None, def get_initkwargs(cls, form_list=None, initial_dict=None,
instance_dict=None, condition_dict=None, *args, **kwargs): instance_dict=None, condition_dict=None, *args, **kwargs):
""" """
Creates a dict with all needed parameters for the form wizard instances. Creates a dict with all needed parameters for the form wizard instances.
@ -144,12 +144,20 @@ class WizardView(TemplateView):
will be called with the wizardview instance as the only argument. will be called with the wizardview instance as the only argument.
If the return value is true, the step's form will be used. If the return value is true, the step's form will be used.
""" """
kwargs.update({ kwargs.update({
'initial_dict': initial_dict or {}, 'initial_dict': initial_dict or kwargs.pop('initial_dict',
'instance_dict': instance_dict or {}, getattr(cls, 'initial_dict', None)) or {},
'condition_dict': condition_dict or {}, 'instance_dict': instance_dict or kwargs.pop('instance_dict',
getattr(cls, 'instance_dict', None)) or {},
'condition_dict': condition_dict or kwargs.pop('condition_dict',
getattr(cls, 'condition_dict', None)) or {}
}) })
init_form_list = SortedDict()
form_list = form_list or kwargs.pop('form_list',
getattr(cls, 'form_list', None)) or []
computed_form_list = SortedDict()
assert len(form_list) > 0, 'at least one form is needed' assert len(form_list) > 0, 'at least one form is needed'
@ -158,13 +166,13 @@ class WizardView(TemplateView):
if isinstance(form, (list, tuple)): if isinstance(form, (list, tuple)):
# if the element is a tuple, add the tuple to the new created # if the element is a tuple, add the tuple to the new created
# sorted dictionary. # sorted dictionary.
init_form_list[six.text_type(form[0])] = form[1] computed_form_list[six.text_type(form[0])] = form[1]
else: else:
# if not, add the form with a zero based counter as unicode # if not, add the form with a zero based counter as unicode
init_form_list[six.text_type(i)] = form computed_form_list[six.text_type(i)] = form
# walk through the new created list of forms # walk through the new created list of forms
for form in six.itervalues(init_form_list): for form in six.itervalues(computed_form_list):
if issubclass(form, formsets.BaseFormSet): if issubclass(form, formsets.BaseFormSet):
# if the element is based on BaseFormSet (FormSet/ModelFormSet) # if the element is based on BaseFormSet (FormSet/ModelFormSet)
# we need to override the form variable. # we need to override the form variable.
@ -179,7 +187,7 @@ class WizardView(TemplateView):
"wizard view in order to handle file uploads.") "wizard view in order to handle file uploads.")
# build the kwargs for the wizardview instances # build the kwargs for the wizardview instances
kwargs['form_list'] = init_form_list kwargs['form_list'] = computed_form_list
return kwargs return kwargs
def get_prefix(self, *args, **kwargs): def get_prefix(self, *args, **kwargs):

View File

@ -245,6 +245,13 @@ wizard's ``as_view()`` method takes a list of your
(r'^contact/$', ContactWizard.as_view([ContactForm1, ContactForm2])), (r'^contact/$', ContactWizard.as_view([ContactForm1, ContactForm2])),
) )
.. versionchanged:: 1.6
You can also pass the form list as a class attribute named ``form_list``.
class ContactWizard(WizardView):
form_list = [ContactForm1, ContactForm2]
.. _wizard-template-for-each-form: .. _wizard-template-for-each-form:
Using a different template for each form Using a different template for each form
@ -295,6 +302,14 @@ The ``urls.py`` file would contain something like::
(r'^checkout/$', OrderWizard.as_view(FORMS, condition_dict={'cc': pay_by_credit_card})), (r'^checkout/$', OrderWizard.as_view(FORMS, condition_dict={'cc': pay_by_credit_card})),
) )
.. versionchanged:: 1.6
The ``condiction_dict`` can be passed as attribute for the ``as_view()``
method or as a class attribute named ``condition_dict``.
class OrderWizard(WizardView):
condition_dict = {'cc': pay_by_credit_card}
Note that the ``OrderWizard`` object is initialized with a list of pairs. Note that the ``OrderWizard`` object is initialized with a list of pairs.
The first element in the pair is a string that corresponds to the name of the The first element in the pair is a string that corresponds to the name of the
step and the second is the form class. step and the second is the form class.
@ -550,6 +565,11 @@ Providing initial data for the forms
The ``initial_dict`` can also take a list of dictionaries for a specific The ``initial_dict`` can also take a list of dictionaries for a specific
step if the step is a ``FormSet``. step if the step is a ``FormSet``.
.. versionchanged:: 1.6
The ``initial_dict`` can also be added as a class attribute named
``initial_dict`` to avoid having the initial data in the ``urls.py``.
.. _wizard-files: .. _wizard-files:
Handling files Handling files