javascript - Django 模型表单集和 Ajax

标签 javascript jquery ajax django

我正在尝试使用 Ajax 提交我的压缩表单集。当请求不是 ajax 时,代码可以完美运行。但是每当我尝试实现 Ajax 时,我都会收到 ValidationError: [u'ManagementForm data is missing or has been tampered with']

我的观点:

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:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax {% 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 %}

最佳答案

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

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

与:

serializedData = $("form").serialize();

代码有效!

关于javascript - Django 模型表单集和 Ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258229/

相关文章:

javascript - 在字符串中回显 JQuery 变量

javascript - 无法在 react 中呈现组件

jquery - 在 Rails 3 中处理 JS/ERB 模板中的 JSON

javascript - jQuery AJAX 问题,间歇性地获取重复请求

javascript - php jquery ajax增量输出

javascript - 如何修复阻止下拉列表工作的 JavaScript 函数

javascript - 将鼠标悬停在图像上,仅使背景变暗

javascript - jQuery $ ('body' ).click() 可以捕获我单击了没有类/id 的嵌套元素吗?

javascript - 哪个 div 当前处于事件状态?

javascript - 如何获取可滚动div的可见尺寸?