【问题标题】:Django WizardForm and second form will be "dynamic"Django WizardForm 和第二种形式将是“动态的”
【发布时间】:2009-08-10 17:36:23
【问题描述】:

我有 2 天的时间思考如何制作这个。

我有两个表单(实际上是 4 个),第一个表单有单选按钮,如果用户选择 x 单选按钮选项,第二个表单会有所不同。

我的英语总是很抱歉。

解释一下:

第一个表单有一个带有单选按钮的选项,这些选项会带来“被调用的表单”,我有 3 个表单正在等待。

我正在阅读有关 WizardForm 的信息,但我不知道如何以动态方式引入第二种形式。

请在这方面需要一些帮助:(

谢谢

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    如果您阅读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
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多