迭代Django自定义表格
问题描述:
我想创建一个动态的表单,使用不同数量的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 %}
答
你所寻找的是形式的绑定列。例如{{form.email}} 您正在迭代Field实例(而不是表单的包装Field实例的BoundField实例),例如{{form.field.email}}。 这就是为什么你都可以从你的模板
<django.forms.fields.CharField object at 0x80bae6da0>
结果。请参阅:https://*.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 %}
,一切都应该按照你的意图工作。
我会推荐使用['FormSet'](https://docs.djangoproject.com/en/1.10/topics/forms/formsets/)。它们提供您开箱即用的功能。 – erikgaal