这是一个相关的 SO 问题:Django and Fieldsets on Modelform,尽管这对于我想要完成的事情来说似乎有点矫枉过正。此外,这是一种可能的 hack,尽管我很想知道 Django 专家是如何解决这个问题的。
(0) 定义一个可迭代的 python 字段集对象,以便我们可以在 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来解决我的具体问题。
+++ 这个答案的大部分内容来自Michael Kowalchik 的这篇博文。+++