2

2ページ書いています。私がやりたいことは、page1 で選択されたデータに従って、page1 の結果によって計算されたオプションを持つ MultipleChoiceField を持つフォームを生成することです。または、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 をインスタンス化できません。ファイルはそこにありますが、最新のものではありません。

じゃあどうすればいいの?私はウェブサイトのデザインにまったく慣れていないので、誰かが助けてくれることを願っています...

4

1 に答える 1

1

あなたがしようとしているのは、最初に選択したオプションに基づいて動的に 2 番目のフォームを作成することだと思います。

私は自分のプロジェクトの 1 つで同様のことをしなければならず、このリンクが非常に便利であることがわかりました: http://jacobian.org/writing/dynamic-form-generation/

__init__2 番目のメソッドのメソッドをオーバーライドして、そのフォームの初期化中にオプションを初期化する必要があります。

2 番目のフォームのコードは次のようになります。

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]

最初のフォームから入力を受け取った後、それをキーワード引数として 2 番目のフォームに渡すことができます。次に__init__、2 番目のフォームの で、そのキーワード引数をポップアウトし、それを使用して編集して選択肢を初期化しますself.fields['fieldneedsdynamicchoices'].choices

于 2012-10-31T13:56:23.957 に答える