Javascript 在django视图中接收ajax发布对象

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

不用说我是新手!下面是我的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("{%  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'))