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

max*_*max 3 javascript python django jquery

不用说我是菜鸟!这是我的 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!');
       }
    );
}
Run Code Online (Sandbox Code Playgroud)

在 firebug 中发布的数据看起来像这样

arr[adminName]  
arr[contactAddress] 
arr[contactEmail]   
arr[contactPhone]   
arr[perPage]    
arr[siteDisableMsg] 
arr[siteTitle]  
arr[uploadSize] 
csrfmiddlewaretoken  BFrb8snw8zime8UI8Vukl8FirsHvDDUk
Run Code Online (Sandbox Code Playgroud)

这是我的 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 !')
Run Code Online (Sandbox Code Playgroud)

但在这一行

   arr  = request.POST.getlist('arr', None)
   print(arr)
Run Code Online (Sandbox Code Playgroud)

继续获取[]...我如何arr从 POST 获取?

顺便说一句,当我打印 POST 时,在控制台中我得到这样的东西

   <QueryDict: { 'csrfmiddlewaretoken': ['BFrb8snw8zime8UI8Vukl8FirsHvDDUk'], 'arr[adminName]': [''],
 'arr[uploadSize]': [''],  'arr[adminName]': [''],  'arr[contactEmail]': [''], 'arr[siteTitle]': [''], 'arr[perPage]': ['']}>
Run Code Online (Sandbox Code Playgroud)

Jus*_*yul 5

有两件事需要注意,首先,JQuery 正在扁平化你的数据结构。对于字典中的每个元素(即变量),它会在 中创建一个具有唯一键的arr元素。QueryDict

所以,

var arr = {'one': 'data1', 'two': 'data2'};
Run Code Online (Sandbox Code Playgroud)

变成

<QueryDict: {'arr[one]': 'data1', 'arr[two]': 'data2'}>
Run Code Online (Sandbox Code Playgroud)

这与您所看到的非常一致。但是,就您的情况而言,实际上您似乎并未用值填充数组。你的萤火虫和QueryDict输出都暗示你有一本空字典。我会调查你的 javascript 的以下行中的值是什么

value = $(this).val();
Run Code Online (Sandbox Code Playgroud)

另外,您使用getlist()错误,它为您提供了与 QueryDict 中的键关联的列表,它没有为您提供您期望的字典。

您不想探索以下内容,首先按JSON.stringify()如下方式序列化您的数组:

$.post("{%  url 'setting-update' %}" , { 'arr': JSON.stringify(arr), csrfmiddlewaretoken :  '{{ csrf_token }}' });
Run Code Online (Sandbox Code Playgroud)

然后将其转换为视图中的Python字典

import json
yourdict = json.loads(request.POST.get('arr'))
Run Code Online (Sandbox Code Playgroud)