【问题标题】:Receiving ajax posted object in django view在 Django 视图中接收 ajax 发布的对象
【发布时间】:2016-06-05 11:43:51
【问题描述】:

不用说我是菜鸟!所以这是我的 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!');
       }
    );
}

在萤火虫中发布的数据看起来像这样

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]': ['']}>

【问题讨论】:

    标签: javascript jquery python django


    【解决方案1】:

    有两点需要注意,首先,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 by

    import json
    yourdict = json.loads(request.POST.get('arr'))
    

    【讨论】:

    • thanx ,我将输入留空,这就是为什么数组中没有设置值的原因...我是 php 开发人员,在 php 中我们可以传递一个 js 对象(oython 中的字典)或数组( list in python) 在 post 请求中,php 会将它们作为数组接收(它像字典和 list 一样工作),我认为 python 会在 POST 中创建一个名为 arr 的字典并将它们放在那里....
    • .... 但显然 python 不尊重 javascript 数据结构,它会将 js 对象 (arr) 与其他发布的数据一起分解到它自己的字典中,并保持与我们相同的数据结构必须将 js 对象更改为 json 字符串.....我做对了多少?
    • Python 没有触及您的 javascript 对象,这在被发送到后端之前被 JQuery 展平。您可以检查请求标头,$.post 方法提交的表单数据包含单独的键/值对,对于您在 javascript 对象中的每个条目。
    • 自从我接触 PHP(我是一名 Java 开发人员,只是喜欢一点 Python)后,它就一直在胡闹,但听起来它很有帮助,并且可以将键转换为 'arrayName 格式[keyname]' 为您创建一个关联数组。所以你不必自己担心。如果您认为合适,您可以很容易地用任何语言^tm 模仿这种行为:D
    【解决方案2】:

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

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

    然后在views.py中

    arr = request.POST.get('arr')
    dict_ = json.loads(arr)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-22
      • 2015-09-18
      • 2011-12-06
      • 2020-11-11
      • 2011-06-30
      • 2015-12-11
      • 2018-01-20
      • 2015-11-25
      相关资源
      最近更新 更多