在 django 的模板中引用动态数量的字段
Posted
技术标签:
【中文标题】在 django 的模板中引用动态数量的字段【英文标题】:Referencing a dynamic number of fields in a template in django 【发布时间】:2011-06-03 23:51:08 【问题描述】:这一切都很简单。我有这个表格:
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 模板语言中引用这些表单域?
【问题讨论】:
【参考方案1】:为了访问动态字段实例的 BoundField 实例,这使您可以访问 all of the attributes and methods necessary to render the field,您需要使用 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 %
(我已经为同样的问题苦苦挣扎了几个小时。感谢this answer from Carl Meyer 和this article on dynamic form generation from Jacob Kaplan-Moss 为我指明了正确的方向。)
【讨论】:
非常感谢您!我已经在一个个人爱好项目上苦苦挣扎了一个月,因为我无法让我的表格正常工作。我感到非常沮丧,因为我觉得这应该只是工作,但不能完全正确地得到咒语。你对我帮助很大。【参考方案2】:将这些字段分组到一个附加列表中,然后简单地遍历这个列表。
在__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:最好的解决方案是不要把它放在模板中,因为它不是模板逻辑。 我在 for 循环中写什么来显示输入字段?在我看来,我仍然有在循环中引用每个“未知”字段名的问题,例如这个 field.su%s % (unit.unit__id) 如果我只写 field 我得到这个作为输出:为了纠正 gruszczy 的回答,这段代码对我有用:
在__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 %
【讨论】:
以上是关于在 django 的模板中引用动态数量的字段的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django,如何在模板中动态设置 ModelForm 字段值?