1

我正在尝试创建一个多页表单,其中第二页上的字段元素数量由第一页上给出的答案定义。

我有一个 formWizard 设置,我的理解是我需要使用 process_step() 来更改下一页的设置。我可以扩展现有的表单定义以添加更多元素,或者将 2 个或更多表单定义合并在一起以生成正确数量的表单元素,但我不知道如何做到这一点。

例如

第 1 页 - 选择感兴趣的主题:

第 2 页 - 对于每个主题:提出相关问题。问题在申请中被定义为单独的表格,但需要显示在一个页面上,或者合并到一个表格中。

非常感谢任何帮助。

花费者

4

2 回答 2

1

花费者,

至少目前我不知道如何将多个表单合并到 FormWizard 中的一个页面上。在 django 1.2 中,您将能够将 FormSets 作为步骤包含在 FormWizards 中(根据此票证),但这些仅处理相同表单的多个副本,而不是许多表单的编译。但是有一种方法可以满足您的要求:

from django.contrib.formtools.wizard import FormWizard
from django import forms

class SubjectForm(forms.Form):
    subjects = forms.MultipleChoiceField(choices = (('language', 'language'), 
                                                        ('sport','sport')))

class RelatedQForm(forms.Form):
    """Overload the __init__ operator to take a list of forms as the first input and generate the 
    fields that way."""
    def __init__(self, interested_subjects, *args, **kwargs):
        super(RelatedQForm, self).__init__(*args, **kwargs)
        for sub in interested_subjects:
            self.field[sub] = forms.CharField(label = "What do you think about %s" % subject)

class SubjectWizard(FormWizard):
    def done(self, request, form_list):
        process_form_list(form_list)

    def process_step(self, request, form, step):
        if step == 1:
            chosen_subs = form.cleaned_data['subjects']
            self.form_list[1] = RelatedQForm(chosen_subs)

使用此代码,您可以像通常在视图中一样实例化您的 FormWizard,然后让向导类处理幕后的所有事情。

一般的想法是重载“RelatedQForm”的初始化类来动态改变字段。此代码片段取自此处。您可以根据需要使init运算符中的处理变得尽可能复杂,阅读“将表单中的字段作为 if-elif 块包含在 for 循环中”......您甚至可能想出一种方法来剥离以编程方式从您当前的表单中获取字段,但我必须看到它们才能弄清楚。

您的“process_form_list”函数将需要使用以下方法遍历字段:

for field, val in form.cleaned_data.items():
    do_stuff

希望这能让你上路:)

于 2009-12-26T17:49:05.120 回答
0

我不认为

self.form_list[1] = RelatedQForm(chosen_subs)

部分工作。我总是收到错误消息:

object is not callable

似乎 form_list 只接受 RelatedQForm (表单的名称),而不是它的实例。

于 2011-01-26T21:26:11.190 回答