我是这样做的:
{{ formset.management_form }}
<table>
{% for form in formset.forms %}
{{ form }}
{% endfor %}
</table>
<a href="javascript:void(0)" id="add_form">Add Form</a>
下面是JS:
var form_count = {{formset.total_form_count}};
$('#add_form').click(function() {
form_count++;
var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count);
$('#forms').append(form)
$('#id_form-TOTAL_FORMS').val(form_count);
});
特别困扰我的是,我必须自己编写escapejs
模板标记。它只是去掉所有的换行符并转义任何单引号,这样它就不会弄乱我的字符串。但是,在这种情况下,Django的制造者到底希望我们做什么呢?当他们可以使用像<input name="my_form_field[0]" />
这样的数组,然后计算它的长度时,为什么他们有这个TOTAL_FORMS
隐藏字段?
发布于 2010-03-02 02:56:15
在Django中有一些地方“原因”是因为Django管理应用程序就是这样实现的,我相信这就是其中之一。因此,答案是他们希望你实现自己的javascript。
查看这篇文章,向Dynamically adding a form...提问,了解更多javascript的想法。
还有两个可插拔的应用程序,django-dynamic-formset和django-dinamyc-form,直到现在我在查找第一个应用程序时才看到它们。
发布于 2010-08-11 08:44:47
这个问题有点老了,但我也花了一段时间才弄明白。
我建议在您的模板中将formset.empty_form呈现为隐藏字段,并在javascript中引用此字段。
下面是来自django admin站点的一个复杂的动态表单集示例:(但请注意,它尚未更新为使用empty_form...)
发布于 2016-03-18 16:06:37
当使用formset.empty_form
作为字符串,将'__prefix__'
替换为实际的形式集表单索引时,存在一些可能的XSS。我的可插拔应用程序将formset.empty_form
转换为Knockout.js模板,然后通过自定义Knockout.js绑定克隆该模板。当新添加的表单在带有内联表单集的整个表单提交之前被动态删除时,Knockout.js还会自动重新计算表单字段id索引。以下是文档:
当使用内联Knockout.js加载自定义字段时,Javascript绑定也会阻止XSS。
https://stackoverflow.com/questions/2353710
复制相似问题