Bri*_*ian 8 forms django templates 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_subunits:
        self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField()
子单元的数量未知.我想用这样的东西(你明白了):
{% for unit in selected_subunits %}
  {{ form.su%s }} % (unit.unit__id)
{% endfor %}
但当然这不起作用.我的问题是如何在Django模板语言中引用这些表单域?
为了访问动态字段实例的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 %}
(几个小时以来,我一直在努力解决这个问题.感谢Carl Meyer的回答以及Jacob Kaplan-Moss关于动态表格生成的文章,指出了我正确的方向.)
将这些字段分组到一个附加列表中,然后简单地迭代该列表。
在__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 %}