Django - 通过Ajax发布jQuery字典在views.py中打印None

jay*_*ayt 3 python django

我的 Django 项目中有一个 Ajax 函数,类似于以下内容......

$('#btn-submit').click(function(e){
  e.preventDefault();
  var btn = $(this);
  var dataUrl = btn.attr('data-href');
  var title = $('#title').val();
  var dict = {};
  $('.choice-m2m-check').each(function(i){
    k = $(this).val();
    v = $(this).attr('data-value');
    dict[k] = v;
  });
  $.ajax({
    url:dataUrl,
    method:'POST',
    data:{
      'title':title,
      'dict':dict,
    },
    success:function(data){
      if (data.saved){
        ...
      }
    },
    error:function(error){
      ...
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

所以我有一个{key: value, ...}字典,它为每个项目分配一个“true”或“false”布尔标志。然后将其发布到由“dataUrl”表示的 URL,Python 在其中对数据进行一些检查。

首先,在 jQuery 中分配键值对后,我使用控制台记录 dict 的值,这在控制台中console.log(dict)提供了类似以下内容的内容。{item-885564895: "true", item-0385245877: "false"}

问题是在我的 Django 视图中,我打印了发布的值,request.POST.get('dict')然后它打印了None. 请注意,当我打印“标题”字段(这是一个常规字符串)时,打印它会返回标题的值。我究竟做错了什么?

Wil*_*sem 5

据我所知,您不能JavaScript 对象作为 HTTP 请求中的有效负载发送。毕竟 JavaScript 不仅仅由字典、整数、字符串等组成。例如,您如何将 a 传输function到服务器?服务器应该如何处理这个问题?

因此,您需要某种格式:一种将数据编码为可用作有效负载的类型的方法:字符串。现在,标准 JavaScript 对象有一种流行的格式:Java S cript对象表示法,或简称为 JSON。

因此,我们可以dict使用以下方法将条目编码为 JSON 字符串JSON.stringify(..)

$('#btn-submit').click(function(e){
  e.preventDefault();
  var btn = $(this);
  var dataUrl = btn.attr('data-href');
  var title = $('#title').val();
  var dict = {};
  $('.choice-m2m-check').each(function(i){
    k = $(this).val();
    v = $(this).attr('data-value');
    dict[k] = v;
  });
  $.ajax({
    url:dataUrl,
    method:'POST',
    data:{
      'title': title,
      'dict': JSON.stringify(dict),
    },
    success:function(data){
      if (data.saved){
        ...
      }
    },
    error:function(error){
      ...
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

当然,现在 Django 后端不会自动将其传输到 Python 对象中:它看到一个字符串,因此将其作为字符串处理。但是 JSON 可以用普通 Pyhon 对象( a dictbool等)进行解码json.loads

from json import loads as jsonloads

def my_view(request):
    mydict = jsonloads(request.POST.get('dict'))
    # process mydict
    # ...
    pass
Run Code Online (Sandbox Code Playgroud)