Django:使用django表单创建HTML输入数组

13 投票
4 回答
22799 浏览
提问于 2025-04-15 20:16

我正在尝试自动创建类似这样的东西:

<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

然后,我应该能够从模板中单独访问每个表单组,把它们都包裹在一起。

撰写回答