假设我有一个包含20个字段的表单,并且我希望将10个这些字段(group1)放在特定的div环境中,将其他10个字段(group2)放在不同的div环境中。类似的东西:
<div class="class1">
{% for field in form.group1 %}
{{ field.label}}: {{ field }}
{% endfor %}
</div>
<div class="class2">
{% for field in form.group2 %}
{{ field.label}}: {{ field }}
{% endfor %}
</div>
我是如何通过迭代字段来实现这一目标的?更一般地说,我希望能够使用许多不同的div环境和表单字段组来完成此操作。
答案 0 :(得分:17)
组合字段的任何逻辑方式都可行...假设您的表单上有一个方法可以返回您明确分组的表单字段?
要保存输入,可能是某个字段前缀命名方案?
class MyForm(forms.Form):
group1_field = forms.CharField()
group1_field = forms.CharField()
group2_field = forms.CharField()
group2_field = forms.CharField()
def group1(self):
return [self[name] for name in filter(lambda x: x.startswith('group1_'), self.fields.values()]
也许在您可以过滤的字段上设置属性?
class MyForm(forms.Form):
field = forms.CharField()
field.group = 1
field2 = forms.CharField()
field2.group = 2
def group1(self):
return filter(lambda x: x.group == 1, self.fields.values())
def group2(self):
return filter(lambda x: x.group == 2, self.fields.values())
如果设置了这些属性,也可以使用regroup标记。
{% regroup form.fields by group as field_group %}
{% for group in field_group %}
<div class="group_{{ group.grouper }}">
{% for field in group.list %}
{{ field }}
{% endfor %}
</div>
{% endfor %}
答案 1 :(得分:4)
这是一个相关的SO问题:Django and Fieldsets on Modelform,虽然这对我想要完成的事情看起来有点过分。此外,这是一个可能的黑客,虽然我很想知道Django专家如何解决这个问题。
(0)定义一个可迭代的python fieldset对象,以便我们可以在django模板中迭代它:
from django.forms.forms import BoundField
class FieldSet(object):
def __init__(self,form,fields,legend='',cls=None):
self.form = form
self.legend = legend
self.fields = fields
self.cls = cls
def __iter__(self):
for name in self.fields:
field = self.form.fields[name]
yield BoundField(self.form, field, name)
(1)在视图中使用:
fieldsets = (FieldSet(form_object, ('field_name1','field_name2'),
legend='Div env 1',
cls="class1"),
FieldSet(form_object, ('field_name3','field_name4'),
legend="Div env 2",
cls="class2"))
return render_to_response('my_form.html',
{'form': form_object,'fieldsets':fieldsets},
context_instance=RequestContext(request))
(2)现在在模板中执行:
{% for set in fieldsets %}
<fieldset{% if set.cls %} class="{{ set.cls }}"{% endif %}>
<legend>{{ set.legend }}</legend>
{% for field in set %}
{{ field.label}} : {{ field }}
{% endfor %}
</fieldset>
{% endfor %}
请注意,可以将fieldset
标记替换为div
标记,以解决我的具体问题。
+++从this blog post by Michael Kowalchik中提取的大部分答案。 +++
答案 2 :(得分:2)
我终于能够将@ Yuji&Tomita&#39; Tomitas 重新组合 -template-tag-solution带到工作中(参见@ Yuji&#39; Tomita和Tomitas的回答?了解困难)。我认为这是一个非常简单的方法来进行字段分组!
解决方案是通过group
字段属性重新组合,访问返回的field
的{{1}}属性。最小的例子:
在 forms.py :
中BoundFields
在模板中:
class TestForm(Form):
a = IntegerField()
a.group = 1
b = IntegerField()
b.group = 1
c = IntegerField()
c.group = 2
d = IntegerField()
d.group = 2