如何根据第1页上的选择在第2页上生成动态MultipleChoiceField选项?

时间:2012-10-31 06:03:40

标签: python django forms dynamic

我正在写2页。我想要做的是,根据第1页中选择的数据,生成一个表单,其中MultipleChoiceField具有由page1结果计算的选项。或者根据文件读取也很好,只是为了获得第2页形式的MultipleChoiceField选项。

我正在使用表单模板,在forms.py中,在page2的表单类中,

class FormPage2(forms.Form): 
    forms.MultipleChoiceField(label='sth to choose',choices=get_tochoose_choices())

get_tochoose_choices()正在读取一些txt文件以获取选项。

但是当我加载第一页时,(我认为python实例化了所有表单,无论它是否在这个页面上或不在一起),这个文件不存在,这意味着FormPage2无法实例化。即使文件存在,也不是最新文件。

那我该怎么办?我对网站设计很陌生,希望有人能帮忙...

1 个答案:

答案 0 :(得分:1)

我相信你要做的是根据第一个选项中的选项动态构建第二个表单。

我必须为我的某个项目执行类似操作,并发现此链接非常有用:http://jacobian.org/writing/dynamic-form-generation/

您需要覆盖第二种方法的__init__方法,从而在初始化该表单时初始化选项。

第二种形式的代码应该是这样的......

def __init__(self, *args, **kw):
    #first remove my custom keyword from the list of keyword args
    try:
        customer = kw['customer']
        kw.pop('customer')
    except:
        customer=None

    super(forms.Form, self).__init__(*args, **kw)
    #now we dynamically add the customer choices - accepts partners as an input
    partners = get_partner_list(customerid=customer.id)
    self.fields['customer'].choices = [(p.id, p.customername) for p in partners]

从第一个表单接收输入后,您可以将其作为关键字参数传递给第二个表单。 然后在第二个表单的__init__中弹出该关键字参数,并使用它通过编辑self.fields['fieldneedsdynamicchoices'].choices来初始化选项