我正在尝试使用不同数量的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 %}
答案 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 %}
并且一切都应该如你所愿。