Django:使用django表单创建HTML输入数组
我正在尝试自动创建类似这样的东西:
<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
我想通过循环一个范围来实现这个目标。我试过一些这样的代码,还有其他几种变体:
# in a model class
for i in range(1, prim+1):
self.fields['asdf'] = forms.CharField(label=i)
# in the template
<form action='#' method='post'>
{{form.as_p}}
</form>
但我一直没有成功。
我该如何自动处理一组输入呢?
** 编辑 **
为了更清楚,我最终需要能够像这样访问模板中的字段:
{% for input in form.fields.asdf %}
{{input}}
{% endfor %}
这样我就能得到上面显示的原始输入列表……
4 个回答
2
这应该更像是,比如说:
# in a model class
for i in range(1, prim+1):
self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i)
不过这很大程度上取决于你想要达到什么目标。
12
Jacob Kaplan-Moss(Django的共同作者)最近写了一篇很棒的文章,讲述如何处理动态表单,这应该能以更好的方式解决你的问题:http://jacobian.org/writing/dynamic-form-generation/
他使用的方法和Felix建议的一样,但读完整篇文章会让你对这个概念有更深入的理解。
使用asdf[]
这种技巧不太规范,因为你需要处理顺序问题。而且这也不是标准的做法。
补充:
如果你需要检测何时触发这些动态字段,可以参考以下内容:
{% for input in form.fields %}
{% ifequal input.label 'asdf' %}
{{ forloop.counter }}: {{input}}<br />
{% endifequal %}
{% endfor %}
2
看起来我可以通过把表单拆分成多个表单组来完成我需要做的事情...
http://docs.djangoproject.com/en/dev/topics/forms/formsets/#topics-forms-formsets
然后,我应该能够从模板中单独访问每个表单组,把它们都包裹在一起。