我正在尝试使用Ajax提交我的压缩表单集.当请求不是ajax时,代码可以正常工作.但每当我尝试实现Ajax时,我都会收到ValidationError:[u'ManagementForm数据丢失或被篡改']
我的观点:
def App(request): lectures = Lecture.objects.all() TopicFormSet = modelformset_factory(Topic, extra=0) SummaryFormSet = modelformset_factory(Summary, extra=0) tquery = Topic.objects.all() squery = Summary.objects.all() #saving formsets: if request.method == 'POST' and request.is_ajax(): t_formset = TopicFormSet(request.POST) s_formset = SummaryFormSet(request.POST) #formset instances if t_formset.is_valid() and s_formset.is_valid(): t_formset.save() and s_formset.save() zipped = zip(t_formset.forms, s_formset.forms) #saving them with new data else: return HttpResponse("not valid formsets, dude") # for testing purposes else: #request=GET t_formset = TopicFormSet(queryset = tquery) s_formset = SummaryFormSet(queryset = squery) zipped = zip(t_formset.forms, s_formset.forms) return render (request, "app.html", {"lectures" : lectures, "zipped" : zipped, "t_formset" : t_formset, "s_formset" : s_formset})
我的Javascript代码:
$(document).ready(function(){ $(".mygt").click(function(){ // it's a button serializedData = $("#id_form-0-name").serialize(); // I didn't know how to "catch" all forms in formset so I am only serializing the first one $.ajax({ url: "/app/", type: "post", data: serializedData, csrfmiddlewaretoken:'{{ csrf_token }}', success: alert(serializedData) }) event.preventDefault(); });
});
PS我还在本文中包含了csrf cookie:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax和{%csrf_token%}出现在表单附近.
编辑:我的HTML:
问题是我不知道如何序列化所有formset,我只是序列化第一个字段(用于测试目的).我不知道Django发送所有formset,而不是像我想的那样发送一个字段.所以我换了
serializedData = $("#id_form-0-name").serialize();
有:
serializedData = $("form").serialize();
代码有效!