2017-04-07 46 views
1

我想创建一个动态的表单,使用不同数量的CharFields。我希望能够在我的表单的半任意位置随意显示它们。我的方法是创建一个可以迭代的函数,以实现正确的self.fields [INDEX]。然而,当我这样做,我真正看到这一点:迭代Django自定义表格

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

我如何做一个CharField()呈现如预期?

我的代码如下:

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/en/1.10/topics/forms/formsets/)。它们提供您开箱即用的功能。 – erikgaal

回答

0

你所寻找的是形式的绑定列。例如{{form.email}} 您正在迭代Field实例(而不是表单的包装Field实例的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字段有

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 %} 

,一切都应该按照你的意图工作。