raj*_*aja 12 javascript django ajax request http-request
如何通过JS和服务器端的AJAX调用传递复合JSON结构,在python中将其读作"非常相似"的数据结构?
我知道可以使用json格式(simplejson等),但我不知何故觉得QueryDict本身在我的情况下格式错误或重新格式化?
例:
通过AJAX向Django视图传递JSON对象[{"id":1},{"id":2},{"id":3}]的数组时,QueryDict的格式为:
POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'],
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'],
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}>
Run Code Online (Sandbox Code Playgroud)
我如何迭代json_data?
我希望得到这样的东西:
POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]},
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']>
Run Code Online (Sandbox Code Playgroud)
这样我就可以将QueryDict作为字典访问并将json_data作为列表检索并按特定顺序处理它:可能只是按顺序列表顺序遍历它们.就像是:
ret = request.POST
for item in ret['json_data']:
process(item['id'])
Run Code Online (Sandbox Code Playgroud)
实际上,进入process()的值可能是另一个键值对的字典,而不仅仅是一个数字(1,2,3等)
使用Javascript:
var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
"/insert_tc",
{
json_data: test,
"type": 'clone',
"csrfmiddlewaretoken": $csrf_token
},
function(json) {
//CALLBACK
},
"json"
);
Run Code Online (Sandbox Code Playgroud)
views.py:
def insert_tc(request):
if request.method == 'POST':
ret = request.POST
type = ret['type']
list = ret.getlist(ret)
Run Code Online (Sandbox Code Playgroud)
但是list返回空[]
我尝试过simplejson转储,加载,项目,获取方法,但没有一个帮助.
我甚至尝试过jQuery.param(obj,true),但这不是我想要的(虽然有些接近).
有没有不同的/更好的方法来通过AJAX来回传递Django < - > JS的复合数据结构?
rad*_*tek 13
您应该使用JSON.stringify()对JSON进行字符串化.这会将JSON对象转换为字符串格式,以便在另一端正确解析.另一方面,您需要使用json.loads()来"解析"对象.
javascript:
var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
"/insert_tc",
{
json_data: JSON.stringify(test),
"type": 'clone',
"csrfmiddlewaretoken": $csrf_token
},
function(json) {
//CALLBACK
},
"json"
);
Run Code Online (Sandbox Code Playgroud)
查看:
import json
def insert_tc(request):
if request.method == 'POST':
ret = request.POST
type = ret['type']
list = json.loads(ret['json_data'])
Run Code Online (Sandbox Code Playgroud)
这实际上是jQuery,而不是Django,很奇怪.您的test变量不包含JSON,而是实际的JS对象.jQuery,出于自身最熟悉的原因,在发布之前将其解析为一些非常奇怪的格式,因此得到的结果.如果你这样做了(注意整个事情的引号):
var test = '[{"id": 1},{"id": 2},{"id": 3}]';
Run Code Online (Sandbox Code Playgroud)
你会发现你几乎得到了你期望的QueryDict:你唯一需要做的就是打电话json.loads(ret['json_data']).
也是因为我无法理解的原因.jQuery不包含任何将对象数组转换为JSON的功能.您需要为此找到插件或单独的库.
| 归档时间: |
|
| 查看次数: |
9046 次 |
| 最近记录: |