你会如何在Django中制作动态的formset?

mpe*_*pen 18 javascript django formsets

这是我做的方式:

{{ formset.management_form }}
<table>
    {% for form in formset.forms %}
        {{ form }}
    {% endfor %}
</table>
<a href="javascript:void(0)" id="add_form">Add Form</a>   
Run Code Online (Sandbox Code Playgroud)

这是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);
});
Run Code Online (Sandbox Code Playgroud)

特别困扰我的是我必须自己编写escapejs模板标签.它只是删除所有换行符并转义任何单引号,这样它就不会弄乱我的字符串.但Django制造商到底希望我们在这种情况下做些什么呢?为什么他们有这个TOTAL_FORMS隐藏的领域,当他们刚刚使用了一个数组<input name="my_form_field[0]" />然后计算它的长度?

Van*_*ale 5

Django中有一些地方"之所以"是因为它是如何为Django管理应用程序实现的,我相信这是其中之一.因此答案是他们希望您实现自己的JavaScript.

看到这个问题动态添加表单...以获得更多javascript想法.

还有两个可插拔的应用程序,django-dynamic-formsetdjango-dinamyc-form,直到现在才查看第一个应用程序.

  • 如果你想用ajax做任何事情或动态添加新对象,那么formset是一个巨大的痛苦.到目前为止,Django在尝试设计Web 2.0类型的应用程序时遇到的最大问题.由于这个原因,我们在Django投资了6个月之后几乎切换到Java框架,但我们决定花费太多时间. (3认同)
  • 编写我自己的 JS 并不是一个真正的问题......我只是好奇为什么他们只给了我们我们需要的一半工具......他们说`empty_form` 可以用于这个,但它用 line 打印-breaks 之类的,在尝试将其塞入 JS 时使用起来不是很友好,除非我误解了某些内容。我想我更喜欢我的动态表单集方法......我怀疑它给客户端带来的压力更小,并且需要更少的代码:)哦......我想我只是吹毛求疵,但我仍然非常不同意很多Django 的设计决策。 (2认同)