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模板语言中引用这些表单域?
为了访问动态字段实例的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关于动态表格生成的文章,指出了我正确的方向.)
将这些字段分组到一个附加列表中,然后简单地迭代该列表。
在__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)
| 归档时间: |
|
| 查看次数: |
2085 次 |
| 最近记录: |