我正在编写一个使用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保存在anchor的href属性中。
所以,我在这里做的是创造比我需要的更多的形式,我只使用它们中的最后一个。
那么,有没有办法告诉inlineformset_factory我想要首先生成哪个ID?
PS:抱歉我的英语不好......
答案 0 :(得分:2)
我所做的是创建一个隐藏的额外表单,然后使用Javascript复制它。 这是复制最后一个表单,使隐藏表单可见,并隐藏表单的新副本。
通过这种方式,您只需计算页面上的表单数量,并将其用于元总表单变量。
如果您希望能够删除页面上的表单,则需要使用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;
答案 1 :(得分:0)
您可以使用auto_id parameter生成具有唯一ID的表单,而不是生成formset工厂:
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())