以django形式分组字段

时间:2014-01-15 12:20:40

标签: python django

我想渲染表单分组字段。表单实际上是根据传入的字典动态创建的

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对象不同。如何渲染字段或是否还有其他更好的组字段方法?

2 个答案:

答案 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;,...],...}。将此附加到表单后,您可以将其传递给视图并从那里传递到模板:

在forms.py中:

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)
        ...

在views.py中:

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