【问题标题】:inlineformset_factory custom form idinlineformset_factory 自定义表单ID
【发布时间】:2010-10-13 08:03:03
【问题描述】:

我正在编写一个使用 ajax 在页面上添加新表单的 Web 应用程序。现有的表单是使用 inlineformset_factory 制作的。 当客户端获取表单时,它会将其插入到正确的位置并更新 #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),

获取表单视图:

def get_form(request, form_type):
    """
    Returns form for requested model if invoken with ajax.
    If invoken directly returns empty string.

    The form is rendered into HTML using as_p method. 
    """
    if request.method == "GET" and request.is_ajax():
        current_forms_no = int(request.GET["current_forms_no"])
        form_class = all_forms[form_type]
        Formset = inlineformset_factory(Component, form_class.Meta.model, extra=current_forms_no + 1, form = form_class, can_delete = False)
        form = Formset()
        return HttpResponse(form.forms[current_forms_no].as_p())
    else:
        return HttpResponse()

以及调用它的 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);
    })
}

我有不止一种形式,所以函数是通用的。我将 form_type 保留在锚的 href 属性中。

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

那么,有没有办法告诉 inlineformset_factory 我想首先生成什么 ID?

PS:对不起我的英语不好......

【问题讨论】:

    标签: ajax django inline-formset


    【解决方案1】:

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

    这样您就可以只计算页面上的表单数量并将其用于元 Total-Forms 变量。

    如果您希望能够删除页面上的表单,则需要对 DELETED 属性进行一些处理。 编辑:这是我使用原型 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;
    

    【讨论】:

      【解决方案2】:

      您可以使用auto_id parameter 来生成具有唯一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())
      

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 2011-02-19
        • 1970-01-01
        • 2021-01-29
        • 2012-08-17
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 2012-03-02
        相关资源
        最近更新 更多