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

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()
Run Code Online (Sandbox Code Playgroud)

子单元的数量未知.我想用这样的东西(你明白了):

{% for unit in selected_subunits %}
  {{ form.su%s }} % (unit.unit__id)
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用.我的问题是如何在Django模板语言中引用这些表单域?

gra*_*pot 7

为了访问动态字段实例的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])
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,您应该能够像通常期望的那样通过访问来遍历字段form.su_fields:

{% for su_field in form.su_fields %}
....
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

(几个小时以来,我一直在努力解决这个问题.感谢Carl Meyer的回答以及Jacob Kaplan-Moss关于动态表格生成的文章,指出了我正确的方向.)


gru*_*czy 4

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

__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)
Run Code Online (Sandbox Code Playgroud)

在模板中:

{% for field in form.subunit_list %}
  ...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 如果我只写 {{ field }} 我会得到以下输出: <django.forms.fields.IntegerField object at 0x022B43F0> (2认同)