12

実際にフィールドの配列を保持するdjangoフォームクラスを作成する方法はありますか? ユーザーに尋ねる可変数の質問をプルアップするデータベースがあり、各質問はウィジェットの定義方法を知っています...など、これをdjangoフォームに接続できないようです。

私はこれを試しました:

class MyForm(forms.Form):
    question = []
    questions = Question.objects.all()
    for q in questions:
        question.append(forms.CharField(max_length=100, label=q.questionText))

しかし、これは、の新しいインスタンスを作成するときに、質問リストを公開していないようですMyForm。djangoフォームを使用して可変数のフォームフィールドを取得する方法はありますか?それとも、これができる範囲を超えていますか?

4

2 に答える 2

17

フォームが (ラベルを含めて) 同一である場合は、フォームセットを使用できる場合あります。例えば

質問: __________________
質問: __________________
質問: __________________

ここでは、各フォームに 1 つのフィールド (「質問」フィールド) のみが含まれていると想定しています。この例には 3 つの形式があります。


単一のフォームで動的な数のフィールドが必要な場合は、を使用__init__して目的を達成できます (注: テストされていないコード!):

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        questions = kwargs.pop('questions')
        super(MyForm, self).__init__(*args, **kwargs)
        counter = 1
        for q in questions:
            self.fields['question-' + str(counter)] = forms.CharField(label=question)
            counter += 1

そして、次のようなフォームを作成します。

form = MyForm(questions=your_list_of_questions)

次の記事が役に立ちます: http://jacobian.org/writing/dynamic-form-generation/

于 2013-06-18T02:26:57.113 に答える
6

もちろんできます!

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        for i, q in enumerate(Question.objects.all()):
            self.fields['%s_field' % i] = forms.CharField(max_length=100, label=q.questionText)

注: フォームの送信時、受信時などにフィールド リストが再入力されるため、次の通話までの間に質問の順序を確認してください。

データが順序付けられていて静的であれば問題ありません。

FormSetまた、あなたのケースにより適したフォームのリストである sを調べることもできます。

于 2013-06-18T02:26:14.393 に答える