【问题标题】:MultiValueDictKeyError on sending data using AJAX to Django 2MultiValueDictKeyError 使用 AJAX 向 Django 2 发送数据
【发布时间】:2018-06-18 23:35:51
【问题描述】:

我正在尝试将此 ajax 请求发送到 python(使用 django 框架):

$.ajax({
    url: '/search/',
    type: 'post',

    data: {
        mname: mname,
        fname: fname
    },
    success: function (data) {
      console.log("result from python: " + data.result);
    }
});

来自djangoviews.py的观点:

def my_search(request): before sending here
    if request.method == 'POST':
        mname = request.POST['mname']
        fname = request.POST['fname']

但是在发送数据后我得到了:

异常类型:MultiValueDictKeyError

异常值:'mname'

我关注this answer 并更改了如下代码:

Ajax 数据部分:

data: {
    json_data: JSON.stringify({ info: {'mname':mname,'fname': fname} })
},

views.py:

data_string = request.POST.get('json_data')
data_dict = json.loads(data_string)
mname = data_dict['info']['mname']
fname = data_dict['info']['fname']

但现在我明白了:

异常类型:TypeError

异常值:JSON 对象必须是 str,而不是 'NoneType'

这显然与第一次尝试错误有关,这意味着 python 未接收到从 ajax 发送的数据。

我该如何解决这个问题?

更新

我使用了Django Documentations about AJAX 并像这样更新了我的代码:

var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
var mname = $("#sname").val();
var fname = $("#fname").val();
var json_data = {
            "mname": mname,
            "fname": fname
        };

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

$("#search-btn").click(function(event){
    event.preventDefault();
    $.ajax({
        url: '/search/',
        type: 'post',
        dataType : "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(json_data),
        success: function (data) {
          console.log("result from python: " + data.result);
        }
    });
});

另外,this post 建议使用代码来检查我尝试过的 POST 数据,但没有任何输出

for key in request.POST:
    print(key)
    value = request.POST[key]
    print(value)

这适用于我使用表单action 发布没有 ajax 的数据,但在这里它什么也没得到。

有什么想法吗?

【问题讨论】:

    标签: ajax django python-3.x


    【解决方案1】:

    mnamefname 都是undefined 时,我得到同样的错误。可以通过以下代码来解释:

    obj_str = JSON.stringify({
        mname: undefined,
        fname: undefined,
    });
    
    obj_str === "{}"    // true
    

    JSON 不支持 undefined 作为数据类型,因此在将对象转换为字符串时会忽略它。不受支持的类型也会发生同样的情况:functionsdates。结果是您的 AJAX 请求发送了一个空对象,该对象解释了您在视图中遇到的错误。

    尝试使用硬编码值进行测试:

    data: {
        mname: "Smith",
        fname: "John"
    },
    

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2017-04-20
      • 2012-03-04
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多