【问题标题】:How to generate dynamic MultipleChoiceField options on page2 according to choice on page1?如何根据page1上的选择在page2上生成动态MultipleChoiceField选项?
【发布时间】:2012-10-20 13:35:43
【问题描述】:

我正在写 2 页。我想要做的是,根据在 page1 中选择的数据,生成一个带有 MultipleChoiceField 的表单,该表单具有由 page1 结果计算的选项。或者根据文件读取也可以,只需要在page2表单中获取MultipleChoiceField的选项。

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

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

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

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

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

【问题讨论】:

标签: python django forms dynamic


【解决方案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 来初始化选项

【讨论】:

  • 非常感谢,我明白了。我通过重写 init 来实现它。但是,顺便说一句,您知道默认的 init 是如何工作的吗?为什么在我覆盖它并设置 self.fields["to_choose"] = forms.MultipleChoiceField(choices=get_tochoose_choices()) 之后,它不会在我加载 page1 时实例化,但如果我没有覆盖默认值 init 它会这样做吗?再次感谢!
  • 你的意思是反过来说吗?选项在您覆盖时实例化,而不是在您不覆盖时实例化。如果你的意思是别的,你能不能进一步澄清一下。我不确定我是否完全理解你。
  • 我的意思是类中的默认 init 初始化所有表单,无论它是在 page1 还是 page2 中生成 html(即使一开始我只是加载 page1,它会报告关于 page2 上的表单的错误无法获取数据),但是在覆盖它之后在生成 page2 时初始化 page2 上的表单。这怎么可能发生?默认的 init 是如何工作的?谢谢,我希望你知道我的意思......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2019-05-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多