我想渲染表单分组字段。表单实际上是根据传入的字典动态创建的
for f in settings.FORM_BIG_FIELDS:
self.fields[f['id']] = eval(f['type'])(label=f['label'], required=f.get('required', True))
self.fields[f['id']].groupp = f.get('group', 1)
groupp属性表示适当的组,然后我尝试将其呈现为
{% regroup form.fields.values by groupp as field_group %}
{% for group in field_group %}
<div class="group_{{ group.grouper }}">
{% for field in group.list %}
<p>
{{ field.all }}
{{ field }}
</p>
{% endfor %}
</div>
{% endfor %}
但是作为输出我得到以下
<django.forms.fields.CharField object at 0xb527388c>
<django.forms.fields.IntegerField object at 0xb52738ec>
<django.forms.fields.ChoiceField object at 0xb527394c>
我读过这些与BoundField对象不同。如何渲染字段或是否还有其他更好的组字段方法?
答案 0 :(得分:1)
如果您不想使用任何其他库,那么最简单的解决方案就是手动渲染它们,我想说。否则,您将花费大量时间重复我复制的库的功能作为评论发布到您的帖子。
总有一种事情应该是干的。但是我们为用户构建网站,用户很少关心模板中的表单呈现方式。出于这个原因,我们经常手动创建表单模板:
<div class="something">
{{ form.fieldname.label_tag }}{{ form.fieldname }}
</div>
最简单的组织方式可以节省您的时间。在我看来,它也不是那么糟糕,因为当你需要由字段集组织的字段时,这并不常见。
答案 1 :(得分:0)
我知道这个问题相当陈旧,但我确信仍然有人可以从一个简单的解决方案中受益:
假设您有一个组名和成员列表。您可以在表单的 init 中定义self.fieldset,使其成为{&#39; group_1&#39;:[&#39; member_1&#39;,&#39]的词典; member_2&#39;,...],...}。将此附加到表单后,您可以将其传递给视图并从那里传递到模板:
class MyForm:
def __init__(self, current_user, *args, **kwargs):
super(YourForm, self).__init__(*args, **kwargs)
self.field['group'].queryset = Group.objects.filter(user = current_user)
...
form = self.Form(current_user)
the_fieldsets = form.fieldset
c = {'form': search_form,
'fieldsets': the_fieldsets }
{% for field in form %}
<tr>
<td>{{field.label_tag}}</td>
{% if field.name == 'group' %}
<td>
<select id='{{field.id}}' name='{{field.name}}'>
{% for k,v in fieldsets.items %}
<optgroup label = {{k.name}}>
{% for val in v %}
<option name='{{val}} value = {{val.id}}> {{val.name}} </option> # Note that the select needs to return 'id', so value has to be {{val.id}}
{% endfor %}
</optgroup>
{% endfor %}
</select>
</td>
{% else %}
<td>{{field}}</td>
{% endif %}
<td>{{field.help_text}}</td>
<td>{{field.errors}}</td>
</tr>
{% endfor %}