Javascript 在django视图中接收ajax发布对象
不用说我是新手!下面是我的js代码,它通过ajax将js对象发送到视图Javascript 在django视图中接收ajax发布对象,javascript,jquery,python,django,Javascript,Jquery,Python,Django,不用说我是新手!下面是我的js代码,它通过ajax将js对象发送到视图 function test(){ arr = {} ; $('#settings_tab').find('.someclass').each(function(index, element) { key = $(this).attr('id') ; value = $(this).val(); arr[key] = value; }); $.post
function test(){
arr = {} ;
$('#settings_tab').find('.someclass').each(function(index, element) {
key = $(this).attr('id') ;
value = $(this).val();
arr[key] = value;
});
$.post("{% url 'setting-update' %}",
{arr:arr, csrfmiddlewaretoken: '{{ csrf_token }}'},
function(){
alert('done!');
}
);
}
firebug中发布的数据如下所示
arr[adminName]
arr[contactAddress]
arr[contactEmail]
arr[contactPhone]
arr[perPage]
arr[siteDisableMsg]
arr[siteTitle]
arr[uploadSize]
csrfmiddlewaretoken BFrb8snw8zime8UI8Vukl8FirsHvDDUk
<QueryDict: { 'csrfmiddlewaretoken': ['BFrb8snw8zime8UI8Vukl8FirsHvDDUk'], 'arr[adminName]': [''],
'arr[uploadSize]': [''], 'arr[adminName]': [''], 'arr[contactEmail]': [''], 'arr[siteTitle]': [''], 'arr[perPage]': ['']}>
heer是我的django view.py
def update(request):
if request.POST :
print('-------------------------------------------------')
print(request.POST)
arr = request.POST.getlist('arr', None)
print(arr)
if(arr is not None):
for k,v in arr:
print(k)
return HttpResponse('done !')
但在这方面
arr = request.POST.getlist('arr', None)
print(arr)
继续获取[]
。。。如何从POST获取arr
顺便说一句,在控制台中,当我打印文章时,我会得到类似的结果
arr[adminName]
arr[contactAddress]
arr[contactEmail]
arr[contactPhone]
arr[perPage]
arr[siteDisableMsg]
arr[siteTitle]
arr[uploadSize]
csrfmiddlewaretoken BFrb8snw8zime8UI8Vukl8FirsHvDDUk
<QueryDict: { 'csrfmiddlewaretoken': ['BFrb8snw8zime8UI8Vukl8FirsHvDDUk'], 'arr[adminName]': [''],
'arr[uploadSize]': [''], 'arr[adminName]': [''], 'arr[contactEmail]': [''], 'arr[siteTitle]': [''], 'arr[perPage]': ['']}>
首先需要将对象序列化为json字符串:
$.post("{% url 'setting-update' %}" ,
{
arr: JSON.stringify(arr), // <-----------
csrfmiddlewaretoken : '{{ csrf_token }}'
},
function(){alert('done!')}
});
这里需要注意两件事,首先,JQuery正在扁平化您的数据结构。对于字典中的每个元素(即
arr
变量),它在QueryDict
中使用唯一键创建一个元素
所以
变成
<QueryDict: {'arr[one]': 'data1', 'arr[two]': 'data2'}>
另外,您使用的getlist()
错误,它会给您一个与QueryDict中的键相关联的列表,而不会像您期望的那样给您一个字典
您不想探究的是以下内容,首先使用JSON.stringify()
序列化您的数组,如下所示:
$.post("{% url 'setting-update' %}" , { 'arr': JSON.stringify(arr), csrfmiddlewaretoken : '{{ csrf_token }}' });
然后在视图中将其转换为python dict
import json
yourdict = json.loads(request.POST.get('arr'))
thanx,我将输入留空,这就是为什么数组中没有设置值。。。我是一名php开发人员,在php中,我们可以在post请求中传递js对象(oython中的dictionary)或数组(python中的list),php将以数组的形式接收它们(其工作方式类似于dictionary和list),我想python会在post中创建一个名为
arr
的字典,并将它们放在那里。。。。。。。。但显然python不尊重javascript数据结构,它会将js对象(arr)
与其他发布的数据一起分解到自己的字典中,为了保持相同的数据结构,我们必须将js对象更改为json字符串。。。。。Python没有触及您的javascript对象,它在发送到后端之前被JQuery压扁。您可以检查请求头,由$.post方法提交的表单数据包含javascript对象中每个条目的单独键/值对。自从我接触PHP(我是一名Java开发人员,只喜欢一点python)以来,它就一直很受欢迎,但这听起来很有用,可以将“arrayName[keyname]”格式的键转换为关联数组。所以你自己不必担心。如果您认为合适,您可以很容易地用任何语言模仿这种行为^tm:D
import json
yourdict = json.loads(request.POST.get('arr'))