Django сериализованный json работает в консоли, но не на странице с запросом ajax

Я просмотрел другие вопросы, связанные с этим, но еще не нашел ответа на мой (первый!) вопрос:

Я сериализую представление django и отправляю его на сервер с помощью ajax (jquery). Я получаю сериализованные данные (протестировал их с предупреждением и получил данные JSON, ответ 200 ok), но не могу заставить следующее работать с успехом:

$('div#nextSet' + currentLetter).click(function(){
      var output = '';
            $.ajax({
                url: 'path/to/django/view',
                data: {'data':sentToServer},
                datatype: 'json',
                error: function(xhr_data) {
                    display_error();
                },
                success: function(data) {
                    $.each(data, function(i){
                        var firstName =data[i].fields.first_name;
                        var lastName = data[i].fields.last_name;
                        var portrait = data[i].fields.portrait;
                        var output = '<ul><li>' + firstName + ' ' + lastName + '</li>';
                        output += '<li><img src="' + portrait + '" /></li></ul>';
                        alert(output);
                    });
                }
            });
        });

Этот код работает в google chrome и firefox в консоли (оповещение отображается с образцом html), но не запускается на странице. Я получаю следующую ошибку:
Uncaught TypeError: Не удается прочитать свойство 'first_name' из неопределенного.

Я попробовал консоль, чтобы увидеть, как получить доступ к элементам карты/словаря javascript, и я могу получить значение при вводе следующего, заменив i фактическим числом: data[number].fields. first_name Значение отображается в консоли, и сообщение об ошибке не появляется.

Это пример данных, возвращаемых представлением django для одного элемента: var data = [{"pk": 8, "model": "app.model", "fields": {"portrait":
"this/is/the/photo/path.png", "first_name": "First", "last_name": "LastName"}}, ].

Все это встроено в код успеха, что означает, что ничего не должно выполняться (?), если обратный вызов не доступен. Итак, если данные присутствуют -- поскольку оповещение (данные) работает, и я получаю ответ 200 ok от сервера -- и код работает в консоли -- это означает, что оповещение обрабатывается и появляется, есть ли что-то, что я упускаю из виду ?


person clekstro    schedule 23.07.2011    source источник
comment
Спасибо @Storm за то, что указал мне правильное направление с помощью console.log. Аргумент для ajax должен быть dataType, а не datatype. Таким образом, он интерпретировал его как строку вместо JSON. Это явно не отображалось в консоли, так как было правильно идентифицировано как объект JSON! Спасибо за помощь...   -  person clekstro    schedule 24.07.2011


Ответы (1)


Тот факт, что вы получаете «Uncaught TypeError: Cannot read property 'first_name' of undefined». предполагает, что поле не определено для данных, но вы фактически получаете объект в массиве.

Одна из идей может заключаться в том, чтобы распечатать консольный статус объекта массива.

Просто добавь:

console.log(data[i])

непосредственно внутри каждой функции

Причина может быть связана с этим

person niklasdstrom    schedule 24.07.2011
comment
Я добавил код в свою функцию .each(), но он почти блокирует браузер, показывая каждый символ в новой строке (это нормально?). Кроме того, относится ли это к тому, почему это работает, когда переменная данных определена в консоли, и точно такой же код вставляется, выполняется и работает успешно? - person clekstro; 24.07.2011
comment
@ frosch62 Тогда я предполагаю, что ваши данные - это не объект, а строка. вы установили mimetype на application/javascript - person niklasdstrom; 24.07.2011
comment
@ frosch62, если вы поместите console.log(data); в вашей функции успеха, что она печатает? это объект или просто данные в виде строки - person niklasdstrom; 24.07.2011
comment
Хорошая догадка! Это тоже было мое подозрение! Но на самом деле я решил проблему. См. мой отредактированный вопрос выше для решения... - person clekstro; 24.07.2011