Django-通过Ajax发布jQuery词典在views.py中不打印任何内容

时间:2018-07-18 14:25:50

标签: 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){
      ...
    }
  });
});

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

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

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

2 个答案:

答案 0 :(得分:1)

据我所知,您可以将JavaScript对象作为有效载荷发送到HTTP请求中。毕竟所有JavaScript都不仅限于字典,整数,字符串等。例如,如何将function传送到服务器?服务器应该如何处理?

因此,您需要的是某种 format :将数据编码的方式可以用作有效载荷:字符串。现在,标准的JavaScript对象具有流行的格式: J ava S crimp O 否定 N 选项,或简称JSON。

因此,我们可以使用dictJSON.stringify(..)条目编码为JSON字符串:

$('#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){
      ...
    }
  });
});

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

from json import loads as jsonloads

def my_view(request):
    mydict = jsonloads(request.POST.get('dict'))
    # process mydict
    # ...
    pass

答案 1 :(得分:0)

错误似乎在js方面。看起来标题字段具有相同的ID和名称,即标题。因此,当单击按钮时,无需调用此函数即可直接提交表单。最好尝试在此功能中添加日志。如果该按钮是动态添加的,请尝试在下面使用

$('#btn-submit').on('click',function(e){
  e.preventDefault();
  alert("This function called")  
});