Группировка полей формы Django

скажем, у меня есть форма с 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 и наборами полей формы.

3 ответов


любой логический способ группировки полей будет работать... скажем, у вас есть метод в форме, который возвращает поля формы, которые вы явно группируете?

чтобы сохранить ввод, возможно, определенную схему именования префикса поля?

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

вот соответствующий вопрос SO:Django и наборы полей на Modelform, хотя это кажется немного излишним для того, что я ищу для достижения. Кроме того, вот один возможный Хак, хотя мне любопытно услышать, как эксперты 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) Теперь в шаблоне do:

{% 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 тег для решения моего конкретного вопроса.

++ + большая часть этого ответа извлечена из этот пост в блоге Майкла Kowalchik. +++


я, наконец, смог принести @Yuji'Tomita'Tomitas перегруппироваться-template-tag-решение для работы (см. комментарии в ответе @Yuji'Tomita'Tomitas, чтобы понять трудности). Я думаю, что это очень хороший и простой способ выполнить группировку полей!

решением было перегруппироваться через group атрибут поля доступа к возвратил BoundFields. Минимальный пример:

в forms.py:

class TestForm(Form):
    a = IntegerField()
    a.group = 1
    b = IntegerField()
    b.group = 1
    c = IntegerField()
    c.group = 2
    d = IntegerField()
    d.group = 2

In шаблон:

<form>
  {% csrf_token %}
  {% regroup form by field.group as field_groups %}
  {% for field_group in field_groups %}
    {{field_group.grouper}}
    {% for field in field_group.list %}
      {{field}}
    {% endfor %}
  {% endfor %}
</form>