Django WizardForm和第二种形式将是“动态的”

时间:2009-08-10 17:36:24

标签: django django-forms

我有2天的想法如何制作这个。

我有两种形式(真的是4种),第一种形式有单选按钮,如果用户选择x单选按钮选项,第二种形式将不同。

总是对我的英语抱歉。

生病解释:

First Form有一个带单选按钮的选项,选项ill带来“被叫表单”,我有3个表单正在等待。

我正在阅读有关WizardForm的内容,但我不知道如何以动态方式提供第二种形式。

请为此提供一些帮助:(

由于

1 个答案:

答案 0 :(得分:2)

如果您阅读contrib/formtools/wizard.py代码,可能会有所帮助。它非常简单,跟随它会让你更好地了解你需要做什么。

在那里有一个process_step挂钩,您需要在自己的表单向导中覆盖它。我做的是看看我在做什么步骤进行一些特殊的处理,如果表格经过验证(即它有cleaned_data):

class MyFormWizard(FormWizard):

    def process_step(self, request, form, step):
        if step == 0 and hasattr(form, 'cleaned_data'):
            # Do special stuff

如果我正确理解了您的问题,您希望第二步根据用户从第一个表单中选择来提供特定表单。在这种情况下,我可能首先尝试为第二步构建动态通用表单,其中使用的字段基于第一个表单的结果(未经测试):

    def process_step(self, request, form, step):
        if step == 0 and hasattr(form, 'cleaned_data'):
            # The initial attribute is a dictionary which maps the step number
            # to a dictionary of what should be initial values.
            # You can use/abuse this in a form's constructor
            self.initial[1] = {'fields': {'field1': field, 'field2': another}}

然后,以你的第二种形式

class MySecondForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(StatBuilderForm2, self).__init__(*args, **kwargs)

        for name, field in kwargs['initial']['fields'].iteritems():
              self.fields[name] = field