我正在编写一个使用 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:对不起我的英语不好...