Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django模型表单集和Ajax_Javascript_Jquery_Ajax_Django - Fatal编程技术网

Javascript Django模型表单集和Ajax

Javascript Django模型表单集和Ajax,javascript,jquery,ajax,django,Javascript,Jquery,Ajax,Django,我正在尝试使用Ajax提交我的压缩表单集。当请求不是ajax时,代码可以完美地工作。但每当我尝试实现Ajax时,都会遇到一个验证错误:[u'ManagementForm数据丢失或被篡改] 我的看法: def App(request): lectures = Lecture.objects.all() TopicFormSet = modelformset_factory(Topic, extra=0) SummaryFormSet = modelformset_facto

我正在尝试使用Ajax提交我的压缩表单集。当请求不是ajax时,代码可以完美地工作。但每当我尝试实现Ajax时,都会遇到一个验证错误:[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();
});
}))

另外,我在本文中也加入了csrf cookie:{%csrf_token%}出现在表单附近

编辑:我的html:

<form action = "http://127.0.0.1:8000/app/" method = "POST">
        {% csrf_token %}
        <!-- t_formset.management_form -->
        {{ t_formset.management_form }}
        <!-- t_formset.management_form -->
        {{ s_formset.management_form }}
        <!-- formsets -->
        {% for topic, summary in zipped %}
        <div id="topic">{{ topic }}</div>
        <br>
        <input type="submit" value="Submit" class="mygt" />
        <br>
        <div id="summary">{{ summary }}</div>
        <br>
        <input type="submit" value="Submit" class="mygt" />
        {% endfor %}

{%csrf_令牌%}
{{t_formset.management_form}
{{s_formset.management_form}
{主题为%,摘要为压缩%}
{{topic}}


{{摘要}
{%endfor%}
您是否将
{{t\u formset.management\u form}}
{s\u formset.management\u form}
如前所述包含在模板中?我遇到了相同的问题,得到了相同的答案

您是否将
{t\u formset.management\u form}
{s\u formset.management}
在所述模板中?我遇到了相同的问题,得到了相同的答案

问题是我不知道如何序列化所有表单集,我只是序列化第一个字段(用于测试目的)。我不知道Django发送所有表单集,而不是像我所想的那样只发送一个字段。所以我换了新的

serializedData = $("#id_form-0-name").serialize();
与:


代码是有效的

问题是我不知道如何序列化所有表单集,而我只是序列化第一个字段(用于测试目的)。我不知道Django发送所有表单集,而不是像我所想的那样只发送一个字段。所以我换了新的

serializedData = $("#id_form-0-name").serialize();
与:


代码是有效的

Apostolos>是的,我很久以前就包含了管理表单….(我现在更新了我的问题。)我感觉问题与csrf令牌或表单集实例有关..Apostolos>是的,我很久以前就包含了管理表单….(我现在更新了我的问题。)我觉得这个问题与csrf令牌或表单集实例有关。如果在ajax调用的数据选项中使用{{csrf_token},我不确定它是否会起作用。我更喜欢使用csrfmiddlewaretoken:$(“input[name='csrfmiddlewaretoken']).val()作为数据选项的一部分。我认为{{csrf_token}}呈现整个输入字段,而您需要它的值。如果我错了,请忽略我:)@Apostolos:我甚至不需要使用csrfmiddlewaretoken:“{{csrf_token}}”部分(我删除了它),因为csrf token已经呈现为表单中的输入字段,DJango负责所有内容:)是的,这是因为您使用了serialize()方法。只是说,如果你不使用它,我认为使用csrf输入的val是正确的方法。很高兴你解决了这个问题。如果你在ajax调用的数据选项中使用{{csrf_token}},我不确定它是否有效。我更喜欢使用csrfmiddlewaretoken:$(“input[name='csrfmiddlewaretoken']).val()作为数据选项的一部分。我认为{{csrf_token}}呈现整个输入字段,而您需要它的值。如果我错了,请忽略我:)@Apostolos:我甚至不需要使用csrfmiddlewaretoken:“{{csrf_token}}”部分(我删除了它),因为csrf token已经呈现为表单中的输入字段,DJango负责所有内容:)是的,这是因为您使用了serialize()方法。只是说,如果你不使用它,我认为使用csrf输入的val是正确的方法。很高兴你解决了你的问题。