Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据第1页的选择在第2页生成动态多个EchoIceField选项?_Python_Django_Forms_Dynamic - Fatal编程技术网

Python 如何根据第1页的选择在第2页生成动态多个EchoIceField选项?

Python 如何根据第1页的选择在第2页生成动态多个EchoIceField选项?,python,django,forms,dynamic,Python,Django,Forms,Dynamic,我写了两页。我想做的是,根据在page1中选择的数据,生成一个具有多个选项的表单,这些选项由page1结果计算。或者读取相应的文件也可以,只需获取page2表单中的multipleEchoiceField选项即可 我正在使用表单模板,在forms.py中,在第2页的表单类中 class FormPage2(forms.Form): forms.MultipleChoiceField(label='sth to choose',choices=get_tochoose_choices()

我写了两页。我想做的是,根据在page1中选择的数据,生成一个具有多个选项的表单,这些选项由page1结果计算。或者读取相应的文件也可以,只需获取page2表单中的multipleEchoiceField选项即可

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

class FormPage2(forms.Form): 
    forms.MultipleChoiceField(label='sth to choose',choices=get_tochoose_choices())
get_tochoose_choices()正在读取一些txt文件以获取选项

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


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

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

我不得不为我的一个项目做类似的事情,发现这个链接非常有用:

您需要重写第二个方法的
\uuuu init\uuu
方法,从而在初始化该表单期间初始化选项

第二个表单的代码应该是这样的

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]
从第一个表单接收输入后,可以将其作为关键字参数传递给第二个表单。
然后在第二种形式的
\uuuuu init\uuuuuuu
中,您弹出该关键字参数,并使用它通过编辑
self.fields['fieldneedsddynamicchoices']来初始化选择。选择

类似于这里的内容?非常感谢,我知道了。我通过重写init实现了它。但是,顺便问一下,你知道默认的init是如何工作的吗?为什么在我重写它并设置self.fields[“to_choose”]=forms.MultipleChoiceField(choices=get_tochoose_choose())之后,它不会在加载page1时实例化,但如果我不重写默认的init,它会这样做?再次感谢!你的意思是反过来说的吗?选项在重写时实例化,而不是在不重写时实例化。如果你的意思是别的,请你进一步澄清一下。我不确定我是否完全理解您的意思。我的意思是,类中的默认init初始化所有表单,无论它是在page1还是page2中生成html(即使最初我只是加载page1,并且它报告了关于page2上的表单的错误,无法获取数据),但是在生成page2时重写它之后初始化page2上的表单。这怎么会发生?默认init是如何工作的?谢谢,我希望你明白我的意思。。。