我的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){
...
}
});
});
因此,我有一个{key: value, ...}
字典,该字典为每个项目分配一个“ true”或“ false”布尔值标志。然后将其发布到由“ dataUrl”表示的URL,在此Python对数据进行一些检查。
因此,首先,在分配了键值对之后的jQuery中,我使用console.log(dict)
控制台记录dict的值,这在控制台中为我提供了类似以下{item-885564895: "true", item-0385245877: "false"}
的内容。
问题是,在我的Django视图中,我打印了request.POST.get('dict')
的发布值,然后打印了None
。请注意,当我打印“ title”字段(它是常规字符串)然后打印时,它会返回title的值。我在做什么错了?
答案 0 :(得分:1)
据我所知,您可以不将JavaScript对象作为有效载荷发送到HTTP请求中。毕竟所有JavaScript都不仅限于字典,整数,字符串等。例如,如何将function
传送到服务器?服务器应该如何处理?
因此,您需要的是某种 format :将数据编码的方式可以用作有效载荷:字符串。现在,标准的JavaScript对象具有流行的格式: J ava S crimp O 否定 N 选项,或简称JSON。
因此,我们可以使用dict
将JSON.stringify(..)
条目编码为JSON字符串:
$('#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){
...
}
});
});
现在,当然,Django后端不会自动将其传输到Python对象中:它看到一个字符串,因此将其作为字符串处理。但是,可以使用dict
在普通Pyhon对象(bool
,json.loads
等)中解码JSON:
from json import loads as jsonloads
def my_view(request):
mydict = jsonloads(request.POST.get('dict'))
# process mydict
# ...
pass
答案 1 :(得分:0)
错误似乎在js方面。看起来标题字段具有相同的ID和名称,即标题。因此,当单击按钮时,无需调用此函数即可直接提交表单。最好尝试在此功能中添加日志。如果该按钮是动态添加的,请尝试在下面使用
$('#btn-submit').on('click',function(e){
e.preventDefault();
alert("This function called")
});