我是 Backbone.js 新手,我正在尝试保存模型实例。 我使用 django 作为我的服务器。
客户端代码:
var Song = Backbone.Model.extend({
defaults: {
name: 'New Song'
},
url: function() {
return window.location.href;
}
});
var song = new Song()
song.save()
csrfmiddlewaretoken
在发送数据之前正确设置。
我单步执行了内部调用的 jQuery $.ajax 函数 Backbone.sync,发现模型对象包含正确的数据。
但是服务器收到的request.POST
是
POST:<QueryDict: {u'[object Object]': [u'']}>
而不是实际数据。知道我哪里出错了吗?
更新:我通过将 Backbone.emulateJSON
设置为 true 进行了快速修复。但根据 Backbone (0.9.2) 代码中的注释,它适用于旧服务器。我正在使用 Django 1.4.1。这是否意味着 django 1.4.1 不兼容?
更新 2:当我将 Backbone.emulateJSON
设置为 false
时,我在 Firefox 中收到以下错误,但在 chrome 中却默默失败。
"[Exception... "Component returned failure code: 0x80460001
(NS_ERROR_CANNOT_CONVERT_DATA)" nsresult: "0x80460001 (NS_ERROR_CANNOT_CONVERT_DATA)"
location: "JS frame :: http://localhost:8000/static/jquery.js :: <TOP_LEVEL> :: line 8214" data: no]"
我使用 jQuery 来实现 ajax,这是 Backbone 的首选,看来错误可能出在 jQuery 中。
更新 3:我通过用我自己的覆盖 Backbone.sync 使用的 $.ajax 解决了这个问题。这仍然是一个快速修复。
Backbone.js 版本:0.9.2
jQuery 版本:1.8.0。还尝试过 1.7.2。结果相同。
最佳答案
我遇到了类似的问题,通过一些侦探工作/运气我找到了它。问题是默认情况下 Backbone 将 POST 数据作为请求正文中的 JSON 编码字符串发送,而不是作为 request.POST
QueryDict 的一部分。因此,要在这种情况下获取数据,您必须使用 python json 库并在 Django View 中调用 json.loads(request.body)
才能正确读取数据。
顺便说一句,设置 Backbone.emulateJSON = true;
起作用的原因是 Backbone 通过“遗留”机制将 JSON 发送到 Django,这使得它出现在 请求中.POST
查询字典。
关于jquery - 保存 Backbone.js 模型数据。数据发送不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204018/