2013-08-07 2 views
1

Я пытаюсь отправить данные на сервер и использовать с AJAXвзаимодействие Джанго и 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 

Джанго поднять ключ „тест“ MultiValueDictKeyError»не найденный в QueryDict '. Когда я меняю «тест»: {} -> "test": 1 он выполняется. Какая у меня ошибка?

ответ

1

Здесь:

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

Вы пытаетесь отправить пустой литерал объекта, как часть запроса POST. jQuery не может понять, какое значение отправить для этого (пустой объект? что бы это означало?), поэтому он просто не отправляет параметр test вообще. Таким образом, на стороне сервера попытка доступа к request.POST['test'] вызывает KeyError.

Когда вы меняете тест на другой литерал (в данном случае число), jQuery может легко кодировать и отправлять это значение.

+0

Почему, если я пишу "тест": { "A": 1}, request.POST [ 'тест'] raise error, но request.POST ['test [a]'] дает 1? – cehmja

+0

@ user2661362: Поскольку jQuery отправляет этот запрос в качестве пары ключ-значение '" test [a] ": 1'. Параметры POST не поддерживают вложенную структуру данных, поэтому jQuery «распаковывает» их. – voithos

0

Вы должны вернуть ответ в формате JSON

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

в Js

alert("Congratulations!"+data.answer); 
Смежные вопросы