迭代Django自定义表单

时间:2017-04-07 04:48:41

标签: python django

我正在尝试使用不同数量的CharField创建动态表单。我希望能够在我的表单中的半任意位置随意显示它们。我的方法是创建一个可迭代的函数,该函数使用了正确的self.fields [INDEX]。但是,当我这样做时,我真的看到了这一点:

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

1 个答案:

答案 0 :(得分:0)

您正在寻找的是表格的BoundFields。例如{{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 %}

修改 刚刚遇到了一个更好(不太脏)的方法: 一个字段有一个

  

get_bound_field(self,form,field_name)

根据文档的方法:https://docs.djangoproject.com/en/1.10/_modules/django/forms/fields/#Field.get_bound_field

所以,在最后一行的子域方法(&#39; yield&#39;行)中,试试这个:

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

然后,您的模板将保持不变:

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

并且一切都应该如你所愿。