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

时间:2016-06-05 11:43:51

标签: 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("{%  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

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

当我打印POST时,在控制台中顺便点一下,我得到类似的东西

   <QueryDict: { 'csrfmiddlewaretoken': ['BFrb8snw8zime8UI8Vukl8FirsHvDDUk'], 'arr[adminName]': [''],
 'arr[uploadSize]': [''],  'arr[adminName]': [''],  'arr[contactEmail]': [''], 'arr[siteTitle]': [''], 'arr[perPage]': ['']}>

2 个答案:

答案 0 :(得分:2)

有两点要注意,首先,JQuery正在压缩你的数据结构。对于词典中的每个元素(即arr变量),它会在QueryDict中使用唯一键创建一个元素。

所以,

var arr = {'one': 'data1', 'two': 'data2'};

变为

<QueryDict: {'arr[one]': 'data1', 'arr[two]': 'data2'}>

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

value = $(this).val();

此外,您使用的是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'))

答案 1 :(得分:1)

首先需要将对象序列化为json字符串:

sumProbs :: (Eq a) => Prob a -> Prob a
sumProbs = Prob . foldr go [] . getProb
    where
    go (x, y) = run
        where
        run [] = (x, y):[]
        run ((a, b):rest)
            | x == a    = (x, y + b): rest
            | otherwise = (a, b): run rest

然后在views.py

$.post("{%  url 'setting-update' %}" , 
    { 
      arr: JSON.stringify(arr), // <-----------
      csrfmiddlewaretoken :  '{{ csrf_token }}' 
    }, 
    function(){alert('done!')}    
});