1

我正在尝试将数据发送到服务器并与 AJAX 一起使用

function stats(e){
    jQuery.ajax({
    type: "POST",
    url:"stats",
    data:{'csrfmiddlewaretoken': document.getElementsByName('csrfmiddlewaretoken')[0].value,
'test':{}},
success: function(data) {alert("Congratulations!"+data);},
error: function(data) {
alert("Please report this error: "+data.responseText);}
});
}

views.py 中的函数:

def stats(request):
    if request.is_ajax():
        if request.user.is_authenticated():
            if request.POST:
                return HttpResponse(request.POST['test'])
            else:
                return HttpResponse("post_no_exists") 
        else:
            return HttpResponse("no authenticate")
    else:
        raise Http404

Django 引发 MultiValueDictKeyError 'key "test" not found in QueryDict'。当我改变 "test":{} -> "test":1 它成功了。我的错误是什么?

4

2 回答 2

1

这里:

...
data: {
    'csrfmiddlewaretoken': ...,
    'test': {}
}
...

您正在尝试发送一个空对象文字作为 POST 请求的一部分。jQuery 无法确定要为此发送什么值(空对象?这甚至意味着什么?),所以它根本不发送test参数。因此,在服务器端,尝试访问request.POST['test']会引发 KeyError。

当您将测试更改为不同的文字(在本例中为数字)时,jQuery 可以轻松地对其进行编码并将其作为值发送。

于 2013-08-07T15:57:33.000 回答
0

您需要以 json 形式返回答案

payload = {'answer': 'post_no_exists'}
return HttpResponse(json.dumps(payload, cls=LazyEncoder), content_type='application/json')

在js中

alert("Congratulations!"+data.answer);
于 2013-08-07T19:03:40.377 回答