我的 Django 项目中有一个 Ajax 函数,类似于以下内容......
$('#btn-submit').click(function(e){
e.preventDefault();
var btn = $(this);
var dataUrl = btn.attr('data-href');
var title = $('#title').val();
var dict = {};
$('.choice-m2m-check').each(function(i){
k = $(this).val();
v = $(this).attr('data-value');
dict[k] = v;
});
$.ajax({
url:dataUrl,
method:'POST',
data:{
'title':title,
'dict':dict,
},
success:function(data){
if (data.saved){
...
}
},
error:function(error){
...
}
});
});
Run Code Online (Sandbox Code Playgroud)
所以我有一个{key: value, ...}字典,它为每个项目分配一个“true”或“false”布尔标志。然后将其发布到由“dataUrl”表示的 URL,Python 在其中对数据进行一些检查。
首先,在 jQuery 中分配键值对后,我使用控制台记录 dict 的值,这在控制台中console.log(dict)提供了类似以下内容的内容。{item-885564895: "true", item-0385245877: "false"}
问题是在我的 Django 视图中,我打印了发布的值,request.POST.get('dict')然后它打印了None. 请注意,当我打印“标题”字段(这是一个常规字符串)时,打印它会返回标题的值。我究竟做错了什么?
据我所知,您不能将JavaScript 对象作为 HTTP 请求中的有效负载发送。毕竟 JavaScript 不仅仅由字典、整数、字符串等组成。例如,您如何将 a 传输function到服务器?服务器应该如何处理这个问题?
因此,您需要某种格式:一种将数据编码为可用作有效负载的类型的方法:字符串。现在,标准 JavaScript 对象有一种流行的格式:Java S cript对象表示法,或简称为 JSON。
因此,我们可以dict使用以下方法将条目编码为 JSON 字符串JSON.stringify(..):
$('#btn-submit').click(function(e){
e.preventDefault();
var btn = $(this);
var dataUrl = btn.attr('data-href');
var title = $('#title').val();
var dict = {};
$('.choice-m2m-check').each(function(i){
k = $(this).val();
v = $(this).attr('data-value');
dict[k] = v;
});
$.ajax({
url:dataUrl,
method:'POST',
data:{
'title': title,
'dict': JSON.stringify(dict),
},
success:function(data){
if (data.saved){
...
}
},
error:function(error){
...
}
});
});Run Code Online (Sandbox Code Playgroud)
当然,现在 Django 后端不会自动将其传输到 Python 对象中:它看到一个字符串,因此将其作为字符串处理。但是 JSON 可以用普通 Pyhon 对象( a dict、bool等)进行解码json.loads:
from json import loads as jsonloads
def my_view(request):
mydict = jsonloads(request.POST.get('dict'))
# process mydict
# ...
passRun Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |