0

我通过 jQuery Ajax 以 JSON 的形式将大量数据推送到 Django 应用程序。数据由服务器接收,但我无法解析它。

在我的视图文件中,我有

from django.http import HttpResponse
from django.utils import simplejson

def saveStrategy(request):
  if not request.user.is_authenticated:
    return HttpResponse(simplejson.dumps({"response" : "failure"}))
  else:

    #This section here throws a TypeError - Expected String or Buffer
    #update_tasks = simplejson.loads(request.POST.get("tasks", False))
    #update_strategy = simplejson.loads(request.POST.get("strategy", False))

    update_strategy = request.POST.get("strategy", False)
    update_tasks = request.POST.get("tasks", False)

    print update_strategy

    return HttpResponse(simplejson.dumps({"response" : "success"}))

这是目的地

if (typeof currentTaskId !== "undefined") {
    $("#save_strategy_task").trigger("click");
    localTasks = JSON.stringify(tasks)
}
else
    localTasks = {};

.ajax({
    url : "saveStrategy/",
    type : "POST",
    data : {"strategy" : JSON.stringify(strategy), "tasks" : localTasks},
    dataType : "json",
    success : function(data) {
        if (data.response == "success")
            strategyDetailCloseHandler();
    }
});

现在,当update_strategy不参与时simplejson,我得到

{
 "title":"Title",
 "status":"pending",
 "strategy":"Strategy",
 "dueDate":"",
 "owner":"",
 "metrics":"test",
 "id":"3",
 "outcome":"Outcome1"
}

但是,如果我尝试

print update_strategy["id"]

我得到TypeError: string indices must be integers错误。

如何解析传入的 JSON 以更新现有的模型对象?

4

1 回答 1

2

代码中存在许多与预期变量类型相关的问题。例如,在 JavaScript 片段中,localTasks可能是 JavaScript 对象{},也可能是来自 的字符串JSON.stringify(tasks)

当这被发布到服务器时,有一个调用

update_tasks = simplejson.loads(request.POST.get("tasks", False))

False如果tasks响应中不存在,它有可能返回一个布尔值。

我相信正在发生的是:

  1. 在客户端,localTasks = {}.
  2. .ajax调用发生时,它不知道如何处理tasks条目,因为.ajax需要键/值对,因此它甚至不将内容发送tasks到服务器。
  3. 服务器上的update_tasks = simplejson.loads(request.POST.get("tasks", False))代码尝试查找taskstasks不存在的代码将request.POSTFalse返回。
  4. JSON 解析器尝试执行 a loads(False),导致您的错误。

要解决这些问题:

  1. 始终localTasks在客户端上转换为一致的类型。即确保它已被转换为字符串。
  2. 不要做request.POST.get('foo', False)。相反,request.POST.get('foo', '')在返回空字符串时执行并处理错误情况。
于 2013-07-24T03:06:13.997 回答