Ссылка на динамическое количество полей в шаблоне в django - PullRequest
8 голосов
/ 05 января 2011

Все очень просто.У меня есть эта форма:

class add_basketForm(forms.Form):
def __init__(self, selected_subunits, *args, **kwargs):


    self.selected_subunits = selected_subunits
    super(add_basketForm, self).__init__(*args, **kwargs)

    for subunit in self.selected_subunits:
        self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField()

Количество подразделений неизвестно.Я хотел бы использовать что-то вроде этого (вы понимаете):

{% for unit in selected_subunits %}
  {{ form.su%s }} % (unit.unit__id)
{% endfor %}

Но, конечно, это не работает.У меня вопрос, как мне ссылаться на эти поля формы на языке шаблонов Django?

Ответы [ 3 ]

7 голосов
/ 03 марта 2011

Чтобы получить доступ к экземплярам BoundField для ваших экземпляров динамического поля, что дает вам доступ к всем атрибутам и методам, необходимым для визуализации поля , вам необходимо получить доступ к объектам поля с помощьюформа form.fieldname вместо form.fields[fieldname]

Вот потенциальный рефакторинг класса вашей формы:

class add_basketForm(forms.Form):
    def __init__(self, selected_subunits, *args, **kwargs):
        super(add_basketForm, self).__init__(*args, **kwargs)
        for subunit in self.selected_subunits:
            self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField()

    def su_fields(self):
        for name in self.fields:
            if name.startswith('su'):
                yield(self[name])

Тогда в вашем шаблоне вы сможете выполнять итерации по полям, когда выобычно ожидают, получив доступ к form.su_fields:

{% for su_field in form.su_fields %}
....
{% endfor %}

(я боролся с этой же проблемой в течение нескольких часов. Благодаря этому ответу Карла Мейера и этой статьео генерации динамической формы от Джейкоба Каплана-Мосса за указание на меня в правильных направлениях.)

4 голосов
/ 05 января 2011

Сгруппируйте эти поля в дополнительный список, а затем просто переберите этот список.

В __init__:

self.subunit_list = []
for subunit in self.selected_subunits:
        field = forms.IntegerField()
        self.fields['su%d' % (subunit['unit__id'])] = field
        self.subunit_list.append(field)

В шаблоне:

{% for field in form.subunit_list %}
  ...
{% endfor %}
1 голос
/ 28 февраля 2015

Чтобы исправить ответ Груши, этот код работал для меня:

В __init__ вашей формы:

self.subunit_list = []
for subunit in self.selected_subunits:
        field = forms.IntegerField()
        self.fields['su%d' % (subunit['unit__id'])] = field
        self.subunit_list.append(self['su%d' % (subunit['unit__id'])])

В вашем шаблоне:

{% for field in form.subunit_list %}
  <!-- show form field (inputbox) -->
  {{ field }}
{% endfor %}
...