2015-09-13 4 views
0

Я сегодня возился с Javascript/JQuery, AJAX, JSON и GeoDjango, и я все перепутал!Django/AJAX: Отправка и получение ответа с POST

До сих пор я смог успешно отправить поисковый запрос из AJAX через запрос POST, выполнить поиск в Django, а затем передать сериализованные данные обратно в AJAX. Тем не менее, я не могу понять, как его декодировать снова с помощью AJAX!

Я получаю эту ошибку: (Uncaught TypeError: Cannot read property 'length' of undefined)

, когда я добавляю в следующей попытке сделать что-то с данными:

$.each (json.results, function (i, val) { 
       //Loop through each returned item and push onto name 
       name.push(val.id); 

       //Loop through each returned item and push name onto var zip 
       zip.push(val.name); 
      }); 

Я думаю, что это отношение Ajax:

var name = []; 
var zip = []; 

... 

//Grab form data 
// Submit on submit 
$('#event_form').on('submit', function(event){ 
    event.preventDefault(); 
    console.log("form submitted!"); // sanity check 
    search_zip(); 
    //define and set variables 
     var searchForm = $("#event_form").val(); 
    return false; 
}); 



// AJAX for submitting search query 
function search_zip() { 
    console.log("event form functional"); // sanity check 
    $.ajax({ 
     url : "/discover/", 
     type : "POST", //http method 
     data : { event_search : $('#search_box').val() }, // data sent with POST request 

    // handle a successful response 
    success : function(json) { 
     $('#search_box').val(''); // remove the value from the input 
     console.log(json); // log the returned json to the console 
     console.log("success"); // another sanity check 

     $.each (json.results, function (i, val) { 
      //Loop through each returned item and push onto name 
      name.push(val.name); 

      //Loop through each returned item and push name onto var zip 
      zip.push(val.zip); 
     }); 

     console.log(name); 
     console.log(zip); 
    }, 

    // handle a non-successful response 
    error : function(xhr,errmsg,err) { 
     $('#results').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+ 
      " <a href='#' class='close'>&times;</a></div>"); // add the error to the dom 
     console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console 
    }}); 
} 

и мой взгляд на всякий случай:

from django.shortcuts import HttpResponse 
from django.views.generic import TemplateView 
from django.core.serializers import serialize 
from AlmondKing.Events.models import Event 
from django.core.exceptions import SuspiciousOperation 

class MapView(TemplateView): 
    template_name = "index2.html" 

    def post(self, request, *args, **kwargs): 
     if request.POST['event_search']: 
      self.object = Event.objects.search(request.POST['event_search']) 
      return HttpResponse(serialize('geojson',self.object), content_type="application/json") 
     else: 
      raise SuspiciousOperation("Blank Request Received") 

Пример вывода:

b'{"type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "features": [{"properties": {"tags": [], "name": "Party", "zip": "19146"}, "geometry": null, "type": "Feature"}, {"properties": {"tags": [], "name": "Jamboree", "zip": "19146"}, "geometry": null, "type": "Feature"}]}' 

Я смущен, как помочь AJAX понять данные. Я использую POST, чтобы я мог выполнять функцию в моем шаблоне TemplateView. Тем не менее, похоже, что настройки AJAX для POST не так хорошо работают для расшифровки сериализованного ответа. Как я могу сделать все это от одного запроса?

ответ

0

Вот последовательность, которая, наконец, работал для меня:

$.each (json.features, function (i, val) 
    name.push(val.properties.name); 
    zip.push(val.properties.zip); 
}); 

name, zip и tags мои модели колонок. Остальное - JSON Django. Я должен указать, что я использую здесь GeoJSON serializer.

Вот график, я сделал, чтобы помочь мне визуализировать картину JSON:

{"type": 
    "FeatureCollection", 

    "crs": { 
     "type": "name", 
     "properties": { 
      "name": "EPSG:4326" 
     }}, 

    "features": [{ 
      "geometry": null, 
      "properties": { 
       "zip": "19146", 
       "name": "Jamboree", 
       "tags": []}, 
       "type": "Feature" 
      }, 

      { 
      "geometry": null, 
      "properties": { 
       "zip": "19146", 
       "name": "Party", 
       "tags": []}, 
       "type": "Feature" 
      }] 
} 

Спасибо всем за помощь мне узнать это!

1

Вы повторяете значение results значения JSON, но, как вы можете видеть из вашего вывода, такого значения нет. Вам нужно пройти через crs.features.

$.each (json.crs.features, function (i, val) { 
    name.push(val.properties.name); 
    zip.push(val.properties.zip); 
} 
+0

Ах! Я начинаю понимать, как это работает ... теперь он говорит мне: «Uncaught ReferenceError: crs не определен». Мне нужно объявить это где-то? –

+0

Смотрите мой обновленный код. –

+0

Hah. Это действительно помогает мне понять синтаксис AJAX! Но, к сожалению, он возвращается к исходной ошибке. Нет сообщений об ошибках, если я удалю его. –

0

Попробуйте добавить:

dataType:"json", 

к вашему $.ajax вызова. Это исправить?

+0

К сожалению, нет. –

+0

Я думаю, что это проблема с итерацией. Некоторое время я уже говорил. 'json.features' возвращает правильные объекты, но я до сих пор не могу перейти к переменным. –

+0

Что вы получите, если вы запустите: '$ .each (json.results, function (i, val) {console.log (val)});'? –