在django中引用模板中动态数量的字段

在django中引用模板中动态数量的字段,django,templates,forms,dynamic,Django,Templates,Forms,Dynamic,一切都很简单。我有以下表格: 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_subu

一切都很简单。我有以下表格:

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()
亚单位的数量未知。我想用这样的东西(你知道的):


但这当然行不通。我的问题是如何在Django模板语言中引用这些formfields?

将这些字段分组到一个附加列表中,然后简单地在该列表上迭代

\uuuu init\uuuu
中:

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 %}
{% for field in form.subunit_list %}
  <!-- show form field (inputbox) -->
  {{ field }}
{% endfor %}

为了访问动态字段实例的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])
然后在模板中,通过访问
表单,您应该能够像通常期望的那样迭代字段。su_fields

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

(我已经为这个问题挣扎了好几个小时。感谢并为我指明了正确的方向。)

为了纠正gruszczy的答案,以下代码对我有效:

在您表格的
\uuuuu init\uuuu
中:

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 %}
  ...
{% endfor %}
{% for field in form.subunit_list %}
  <!-- show form field (inputbox) -->
  {{ field }}
{% endfor %}
{%for form.subunit_list%中的字段}
{{field}}
{%endfor%}

+1:最好的解决方案是不要将其放入模板中,因为它不是模板逻辑。我应该在for循环中写入什么来显示输入字段?在我看来,我仍然存在引用循环中每个“未知”字段名的问题,例如,这个{field.su%s}%(unit.unit\u id),如果我只写{{field},我会得到这个作为输出:我想我的答案一定是使用表单集,也许。KillianDS:那你怎么做?我是Django的新手,所以我对模板逻辑没有你那么精通。非常感谢你!一个月来,我一直在为一个个人爱好项目苦苦挣扎,因为我的表格无法正常工作。我真的很沮丧,因为我觉得这是一个应该起作用的东西,但不能完全正确地理解咒语。你帮了我很大的忙。