Ajax inlineformset\u工厂自定义表单id

Ajax inlineformset\u工厂自定义表单id,ajax,django,inline-formset,Ajax,Django,Inline Formset,我正在编写一个使用ajax在页面上添加新表单的web应用程序。现有表格使用inlineformset_工厂制作。 当客户端获得表单时,它会将其插入正确的位置,并更新#id_form_type-TOTAL_FORMS(在本例中,form_type是表单的名称)的值 现有表单对每个字段都有名称,如name=“form_type-1-source”,其中1是唯一的表单ID 问题是为新表单生成下一个ID,以便所有表单都不同。我提出了一个解决方案,但我不喜欢它 ajax调用的Url如下所示: (r'^aj

我正在编写一个使用ajax在页面上添加新表单的web应用程序。现有表格使用inlineformset_工厂制作。 当客户端获得表单时,它会将其插入正确的位置,并更新#id_form_type-TOTAL_FORMS(在本例中,form_type是表单的名称)的值

现有表单对每个字段都有名称,如name=“form_type-1-source”,其中1是唯一的表单ID

问题是为新表单生成下一个ID,以便所有表单都不同。我提出了一个解决方案,但我不喜欢它

ajax调用的Url如下所示:

(r'^ajax/get_form/(?P<form_type>\w+)$', views.get_form),
以及调用以下内容的JavaScript函数:

function add_new_form(event) {
    event.preventDefault();
    form_type = $(this).attr("href");

    // for id generation
    formset = $("#id_" + form_type + "-TOTAL_FORMS");
    current_forms_no = formset.val()

    container = $(this).parent().parent();
    $.get("/ajax/get_form/" + form_type, {"current_forms_no" : current_forms_no}, function(data) {
        container.append(data);
        container.append("<hr>");

        // increment form count so they can be saved on server
        formset.val(parseInt(formset.val()) + 1);
    })
}
函数添加新表单(事件){
event.preventDefault();
form_type=$(this.attr(“href”);
//用于id生成
表格集=$(“#id"+表格类型+”-表格总数);
当前_forms_no=formset.val()
容器=$(this.parent().parent();
$.get(“/ajax/get\u form/”+form\u type,{“current\u forms\u no”:current\u forms\u no},函数(数据){
容器。追加(数据);
容器。追加(“
”); //增加表单计数,以便将它们保存在服务器上 val(parseInt(formset.val())+1); }) }
我有多个表单,所以函数是泛型的。我在锚的href属性中保留表单类型

所以,我在这里做的是创建比我需要的更多的表单,我只使用最后一个表单

那么,有没有办法告诉inlineformset_工厂我想首先生成什么ID


PS:抱歉我的英语不好…

我做的是创建一个隐藏的额外表单,然后用Javascript简单地复制它。 即复制最后一个表单,使隐藏的表单可见,并隐藏表单的新副本

通过这种方式,您可以只计算页面上的表单数量,并将其用于元合计表单变量

如果您希望能够删除页面上的表单,则需要对已删除的属性进行一些处理。 编辑:下面是我使用prototype js的主要功能之一

function add_form_to_formset(formset, callbacks etc...){
   // Management form
   total_forms_element = $('id_' + formset.prefix + '-TOTAL_FORMS');

   var curr_last_id = biggest_id(formset.form_class);
   var last_form = $('id_' + formset.prefix + '-' + curr_last_id + '-id').up();

   // Copy it
   var new_form = last_form.cloneNode(true);

   ...register some buttons like add/remove etc..

   set_form_id(new_form, curr_last_id+1);

   last_form.show();
   last_form.insert({after:new_form});


   // Increment the management form count
   total_forms_element.value = parseInt(total_forms_element.value) + 1;

您可以使用生成具有唯一ID的表单,而不是生成表单集工厂:

def get_form(request, form_type):
    current_forms_no = int(request.GET["current_forms_no"])
    form_class = all_forms[form_type]
    form = form_class(auto_id='id_%%s_%s' % current_forms_no)
    return HttpResponse(form.as_p())
def get_form(request, form_type):
    current_forms_no = int(request.GET["current_forms_no"])
    form_class = all_forms[form_type]
    form = form_class(auto_id='id_%%s_%s' % current_forms_no)
    return HttpResponse(form.as_p())