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

10

Скажем, у меня есть форма с 20 полями, и я хочу поместить 10 из этих полей (group1) в определенную среду div, а остальные 10 полей (group2) - в другую среду div. Что-то вроде:

<code><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>
</code>

Любые идеи, как я мог бы сделать это, перебирая поля? В целом, я хотел бы иметь возможность делать это с множеством различных сред div и наборов полей формы.

Ваш Ответ

3   ответа
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 %}
Error: User Rate Limit ExceededyieldError: User Rate Limit Exceeded C. Reed
Error: User Rate Limit Exceeded C. Reed
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededModelFormError: User Rate Limit ExceededFormError: User Rate Limit ExceededModelFormError: User Rate Limit ExceededFormError: User Rate Limit Exceeded
2

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

Решение было перегруппировать черезgroup атрибут поля доступа кfield атрибут возвращается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

В шаблоне:

<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>
4

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

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

yield self.form[name]Error: User Rate Limit Exceeded

Похожие вопросы