2009-07-30 15 views
5

複数のフィールドを持つDjangoフォームを1つn回繰り返す必要があります(nは設計時には分かりません)。 (もし可能ならば)?Django - フォームフィールドを1つの形式でn回繰り返す

代わりに: - :

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name[n] = forms.CharField(widget=ValueHiddenInput()) 

おかげで、
リチャード -

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name_1 = forms.CharField(widget=ValueHiddenInput()) 
    item_name_2 = forms.CharField(widget=ValueHiddenInput()) 
    . 
    . 
    . 
    item_name_n = forms.CharField(widget=ValueHiddenInput()) 

私のようなものが必要。

答えて

8

:ダイナミックフォームについて

class PaymentsForm(forms.Form): 
    invoice = forms.CharField(widget=forms.HiddenInput()) 
    total = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(10): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

詳細は、例えば見つけることができますhere

編集:あなたのコメントでの質問に答える:あなたが作成どこでも、あなたのビューで、その後

def __init__(self, repetitions, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(repetitions): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

および(または:ちょうど、__init__メソッドに引数として、このような何かを繰り返し回数を与えますフォーム):

payments_form = PaymentsForm(10) 
+0

これは素晴らしいですね。フォームのインスタンスを作成するときにxrange(n)値をクラスに渡すにはどうすればよいですか? - (私は自分自身のいくつかのpythonの本を入手する必要があります:)) – Frozenskys

+0

これは動作しますが、別のフォームオブジェクトに "n回"フィールドを分割し、Daniel Rosemanの答えのようにFormsetを使用することをおすすめします。 –

+0

私はこのようにいくつかの機会にそれをやった:) – Jiaaro

4

formsetsを使用してください。あなたは、フォームの__init__方法で繰り返しフィールドを作成することができます

+2

formsetsはフィールドではなく、複数回モデルを繰り返します。 – priestc

+0

一度しか繰り返されないフォームに他の値があると、これはどうなりますか?私はこれを示すために質問を編集しました。 – Frozenskys

+0

+1これは、__init__メソッドで余分なフィールドを追加するよりも洗練された解決策です。 HTMLフォームは単一のDjango Formオブジェクトである必要はなく、多くのFormオブジェクトでもかまいません。この場合、すべての1回限りのフィールドに1つのフォームを使用し、繰り返しフィールドを含む別のフォームを使用します。これはFormsetで使用する2つ目のフォームです。これがFormsetsが存在する理由です。 –

関連する問題