2017-04-07 13 views
1

CharFieldの数を変えて動的フォームを作成しようとしています。私は自分のフォームの中で半恣意的な場所に自由に表示できるようにしたい。私のアプローチは、正しいself.fields [INDEX]をフィールドする反復可能な関数を作成することでした。私は予想通りCharFieldですが()レンダリング作るにはどうすればよいDjangoカスタムフォームを反復する

<django.forms.fields.CharField object at 0x80bae6be0> 
<django.forms.fields.CharField object at 0x80bae6f98> 
<django.forms.fields.CharField object at 0x80bae6da0> 

:しかし、私はこれを行うとき、私は、文字通り、これを参照してください?

私のコードは以下の通りです:

class ImplementationForm(forms.ModelForm): 
    """ 
    Specifies the implementation of a given control. 
    """ 
    class Meta: 
     model = Implementation 
     fields = ['implemented', 'scope', 'separate'] 

    def __init__(self, *args, **kwargs): 

     control = kwargs.pop('control') 

     super(ImplementationForm, self).__init__(*args, **kwargs) 
     self.fields['separate'].widget.attrs.update({'class': 'separate'}) 
     self.fields['scope'].widget.attrs.update({'class': 'scope'}) 

     for substatement in control.substatement.all(): 
      self.fields['statement_%s'%substatement.pk] = forms.CharField() 

    def subfield(self): 
     print("Comes herE") 
     for index in self.fields: 
      if index[:10] == 'statement_': 
       yield self.fields[index] 

テンプレートは、基本的にはこの行います。あなたが探しているものを

{% for x in myform.subfield %} {{ x }} {% endfor %} 
+0

['FormSet'](https://docs.djangoproject.com/ja/1.10/topics/forms/formsets/)の使用をお勧めします。彼らはあなたが箱から要求する機能を提供します。 – erikgaal

答えて

0

するフォームのBoundFieldsです。例えば{{form.email}} フィールドインスタンスを繰り返します(フィールドインスタンスをラップするフォームのBoundFieldインスタンスではありません)。 {{form.field.email}}。 あなたのテンプレートから

<django.forms.fields.CharField object at 0x80bae6da0>

結果を得ている理由です。参照:https://stackoverflow.com/a/671305/3035260

はまた、Djangoのドキュメントを参照してください。https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.BoundField

は(はるかに優れたソリューションのための以下の私の編集を参照してください)この汚いやり方を試してみてください:

{# Iterate over your list of field instances #} 
{% for x in myform.subfield %} 
    {# Find the matching BoundField instance #} 
    {% for field in myform %} 
    {% if field.field == x %} 
     {# Matching BoudField instance found, display it. #} 
     {{ field }} 
    {% endif %} 
    {% endfor %} 
{% endfor %} 

編集: ちょうど出会いましたより良好な(より少ない汚れた)アプローチ: Aフィールド

012を有しています

get_bound_fieldドキュメントによると(自己、フォーム、FIELD_NAME)

方法:https://docs.djangoproject.com/en/1.10/_modules/django/forms/fields/#Field.get_bound_field

だから、最後の行( '降伏' 行)でのごサブフィールド法では、これを試してみてください。

yield self.fields[index].get_bound_field(self, index) 

次に、あなたのテンプレートが同じまま:

{% for x in myform.subfield %} {{ x }} {% endfor %} 

はすべてあなたが意図したとおりに動作するはずです。

関連する問題