【问题标题】:How to correctly post with jQuery / Ajax in Django model如何在 Django 模型中正确使用 jQuery / Ajax 发布
【发布时间】:2020-07-08 12:46:41
【问题描述】:

我正在尝试使用 jQuery/Ajax 将 POST 数据添加到我的 Django 相关模型中。尽管遇到了许多关于该主题的问题,但我还是无法完成在表格中发布数据的工作。

如果我使用普通格式 submit,数据会保存在两个表中,但是在使用 ajax 时,我会不断收到 400 (Bad Request)

我处理 ajax 请求的 view 是:

def ajxCreateRtp(request):
    if request.is_ajax and request.method == "POST":
        form = RtpCreateForm(request.POST)

        if form.is_valid():
            instance = form.save(commit=False)
            formset = CreateRtpFormset()
            if formset.is_valid():
                formset_instance = formset.save()
                instance = form.save()

                ser_instance = serializers.serialize('json', [ instance, formset_instance, ])
                return JsonResponse({"instance": ser_instance}, status=200)
            else:
                return JsonResponse({"error": form.errors}, status=400)

    return JsonResponse({"error": ""}, status=400)

控制台中的错误如下:

POST http://127.0.0.1:8000/.../.../.../rtp/ajax/add/ 400(错误请求) 发送@jquery-3.4.1.js:9837 ajax@jquery-3.4.1.js:9434(匿名)@ (index):1011 dispatch @ jquery-3.4.1.js:5237 elemData.handle @ jquery-3.4.1.js:5044

注意如果我从 ajxCreateRtp 视图中删除 .formset 部分,标题表单中输入的数据将保存到父模型。

模板中的jQuery/Ajax脚本是:

$(function() {
    $('#rtpForm').submit(function(e) {
        e.preventDefault();
        var data = $(this).serialize();
        // console.log(data);
        
        $.ajax({
            type: 'POST',
            url: "{% url 'ajax_add_rtp' %}",
            data: data,
            success: function(response) {
                console.log('Data Saved');
            },
            error: function (response) {
                console.log('Problem encountered');
            }
        });
    });
});

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 400 响应的正文中有什么内容?看起来您的表单无效,并且您在响应正文中返回表单的验证错误。这些错误应该可以解释发生了什么。
  • @schillingt By body 我是否了解控制台的Network 中各个选项卡中包含的数据?例如。常规、响应标头等?
  • 是的,控制台中的网络选项卡,然后查找对 /rtp/ajax/add 的请求,单击它并查看请求以查看通过线路发送到服务器的内容,然后然后响应以查看服务器响应的内容。响应端应该包含错误。
  • @schillingt 对不起。第一次提到控制台的这一部分。我可以看到标签 中有部分,即 GeneralResponse HeadersRequest HeadersForm Data >标题。在 Response 选项卡下,我看到一个输出:{"error": ""}。我可以将问题中 General 选项卡的内容复制为 Edit 吗?谢谢。
  • @schillingt 我指的是 Headers 选项卡中的内容。

标签: jquery django ajax django-models


【解决方案1】:

form.is_valid() is False 的情况似乎没有得到妥善处理。添加另一个返回语句以包含表单的错误并调整另一个以包含表单集的错误似乎更合适。它应该为您提供信息以继续在浏览器开发者工具的网络 -> 响应面板中进行调试。

def ajxCreateRtp(request):
    if request.is_ajax and request.method == "POST":
        form = RtpCreateForm(request.POST)

        if form.is_valid():
            instance = form.save(commit=False)
            formset = CreateRtpFormset()
            if formset.is_valid():
                formset_instance = formset.save()
                instance = form.save()

                ser_instance = serializers.serialize('json', [ instance, formset_instance, ])
                return JsonResponse({"instance": ser_instance}, status=200)
            else:
                return JsonResponse({"error": formset.errors}, status=400)
        return JsonResponse({"error": form.errors}, status=400)

    return JsonResponse({"error": "Invalid request type."}, status=400)

【讨论】:

  • 更新了视图。在 Response 选项卡下,它现在显示{"error": []}。此外,在检查 Form Data 标题下的数据时,我发现针对 ids 的条目是 blank (我认为应该是因为这些将被创建为记录是否保存?)。休息我想不通。顺便说一句,子模型id 是一个 AutoField(不是 Django 创建的)。
  • 凭直觉,尝试为数据库中已创建的标题字段组合创建新记录。正如它应该发生的那样,在 Response 面板中抛出的错误是 ValidationError 消息:{"error": {"rtp_material": ["Record exists for the combination of key values."]}}。我认为来自代码的{"error": form.errors}, status=400 段。这是否意味着formset 验证没有发生(或有效)?
  • 更改代码中的响应,看看结果如何。或者,您可以附加一个调试器并通过 IDE 或使用 PDB 手动单步调试。
  • 刚刚按照建议做了,你猜怎么着,错误来自formset 段!!?就像我在我的问题中已经说过的那样,我能够将数据(模型 - 表单和表单集数据)保存为普通表单 submit - 所以我无法理解发生了什么这里错了吗? (延迟响应 - 由于 SO 服务因维护而脱机)...
  • 谢谢。计划安装 PDB 并深入研究。
猜你喜欢
  • 2012-11-08
  • 2014-07-14
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
相关资源
最近更新 更多