Django1.1formwizard,动态扩展表单

2024-09-30 22:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

例如

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

第2页-针对每个主题:提出相关问题。问题在应用程序中被定义为单独的表单,但需要显示在一页上,或者合并成一个表单。在

任何帮助都非常感谢。在

挥霍者


Tags: 答案应用程序元素表单主题数量定义step
2条回答

我不认为

self.form_list[1] = RelatedQForm(chosen_subs)

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

^{pr2}$

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

斯宾德

至少目前我不知道如何在窗体向导中将多个窗体合并到一个页面上。在django1.2中,您将能够在FormWizards中包含表单集作为步骤(按照this ticket),但是这些操作只处理相同表单的多个副本,而不是许多表单的编译。但有一种方法可以满足你的要求:

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)

使用这段代码,您可以像在视图中一样实例化窗体向导,然后让wizard类处理幕后的一切。在

一般的想法是重载“RelatedQForm”的init类,以动态更改字段。此代码段取自here。您可以让init运算符中的处理尽可能复杂,阅读“包括表单中的字段,就像elif块在for循环中一样”。。。你甚至可以想出一种方法,从你当前的表单中去掉这些字段,但我必须让他们来解决这个问题。在

您的“process_form_list”函数需要在字段上循环,使用类似的方法:

^{pr2}$

希望这能让你上路:)

相关问题 更多 >