Я сегодня возился с 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'>×</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 не так хорошо работают для расшифровки сериализованного ответа. Как я могу сделать все это от одного запроса?
Ах! Я начинаю понимать, как это работает ... теперь он говорит мне: «Uncaught ReferenceError: crs не определен». Мне нужно объявить это где-то? –
Смотрите мой обновленный код. –
Hah. Это действительно помогает мне понять синтаксис AJAX! Но, к сожалению, он возвращается к исходной ошибке. Нет сообщений об ошибках, если я удалю его. –