在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的新手,所以我对模板逻辑没有你那么精通。非常感谢你!一个月来,我一直在为一个个人爱好项目苦苦挣扎,因为我的表格无法正常工作。我真的很沮丧,因为我觉得这是一个应该起作用的东西,但不能完全正确地理解咒语。你帮了我很大的忙。