Django表单中的分组字段

wrrgggsh  于 2023-10-21  发布在  Go
关注(0)|答案(3)|浏览(87)

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

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对象不一样。如何呈现字段,或者是否有其他更好的方法来分组字段?

ymzxtsji

ymzxtsji1#

如果你不想使用任何额外的库,那么最简单的解决方案是手动渲染它们,我会说。否则你只会花很多时间重复我复制的库的功能作为评论到你的帖子。
总是有这样的情况下,事情应该是干燥的。但是我们为用户建立网站,用户很少关心模板中的表单渲染是如何完成的。出于这个原因,我们经常像这样手动创建表单模板:

<div class="something">
{{ form.fieldname.label_tag }}{{ form.fieldname }}
</div>

最简单的方式来组织它节省你一些时间。在我看来,这也不是那么糟糕,因为当你需要按字段集组织字段时,这并不常见。

cfh9epnr

cfh9epnr2#

我知道这个问题相当古老,但我相信仍然有人可以从一个简单的解决方案中受益:
假设您有一个组名称和成员列表。您可以在表单的init中定义一个self.fieldset作为“group_1”的字典:登录'member_1','member_2',.],...}。一旦你把它附加到表单上,你就可以把它传递给视图,然后从视图传递给模板:

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

v1l68za43#

秘诀就是用途:

self[name]

在form object中。所以你可以在任何字典中使用它,比如:

def __init__(self, *args, **kwargs):
    super().__init__( *args, **kwargs)
    self.fields['field01'] = forms.IntegerField()
    self.groupe1 = {'foo' : self['field01']}

现在它将在模板中正确渲染。但是在上面的代码中,你还必须处理字段的初始值和数据值。但这是另一个问题。

相关问题