11

Вопрос по request, ajax, javascript – Django: чтение массива объектов JSON из QueryDict

Как передать составную структуру JSON через вызов AJAX из JS и на стороне сервера, прочитать ее как «очень похожую» структура данных в питоне?

Я понимаю, что можно использовать форматирование json (simplejson и т. Д.), Но мне почему-то кажется, что сам QueryDict искажен или переформатирован в моем случае?

Пример:

При передаче массива объектов JSON [{& quot; id & quot ;: 1}, {& quot; id & quot ;: 2}, {& quot; id & quot ;: 3}] через AJAX в представление Django, QueryDict форматируется как:

POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'], 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], 
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}>

Как мне даже перебрать json_data?

Я хочу получить что-то вроде этого:

POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]},
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']>

Так что я могу получить доступ к QueryDict в качестве словаря и получить json_data в виде списка и обработать его в определенном порядке: возможно, просто выполнить итерацию по ним в последовательном порядке списка. Что-то вроде:

ret = request.POST
for item in ret['json_data']:
    process(item['id'])

Фактически значение, которое входит в process (), может быть другим словарем пар ключ-значение, а не просто числом (1,2,3 и т. Д.)

Javascript:

var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
    "/insert_tc",
    {
      json_data: test,
      "type": 'clone',
      "csrfmiddlewaretoken": $csrf_token
    },  
    function(json) {
        //CALLBACK
    },
    "json"
);  

views.py:

def insert_tc(request):
    if request.method == 'POST':       
    ret = request.POST
    type = ret['type']
    list = ret.getlist(ret)

Но список возвращается пустым []

Я пробовал дампы простой загрузки, загрузки, элементы, методы получения, но ни один из них не помог.

Я даже попробовал jQuery.param (obj, true), но это не то, что я хочу (хотя и несколько близко).

Существует ли другой / лучший способ передачи составных структур данных назад и вперед? Django & lt; - & gt; JS через AJAX?

  • JSON, по-видимому, не доступен в более старых версиях IE. Думал, кто-то хотел бы знать. Тем не менее, кажется, что лучший способ сделать это.

    от
  • Моя вера в человечество восстановлена. Спасибо! Я почти получил это работает. Было бы здорово узнать причину такого поведения (возможно, некоторые рецензии / ссылки?)

    от rajivRaja
  • Спасибо! Хотя ответ Даниэля был своевременным и действительно помог мне преодолеть препятствие, я переключаюсь на этот ответ, чтобы он был принят, поскольку JSON.stringify () делает работу более аккуратно.

    от rajivRaja
  • Я боюсь, что код JS является точным. Я скопировал вставленный фрагмент JS и вывод запроса на печать из views.py с незначительным форматированием. & APOS; тест & APOS; это массив объектов, которые я передаю.

    от rajivRaja
  • Что-то определенно не так, потому что опубликованный код определенно не даст такой результат QueryDict. Пожалуйста, вы можете опубликовать точный код, который выводит это?

    от Daniel Roseman
  • Извините моя ошибка. Смотрите мой ответ ниже.

    от Daniel Roseman
  • 12

    Вы должны структурировать свой JSON с помощью JSON.stringify (). Это п

    реобразует объект JSON в строковый формат, чтобы его можно было правильно проанализировать на другом конце. С другой стороны, вам нужно будет использовать json.loads (), чтобы «удалить строку». предмет.

    javascript:

    var test = [{"id": 1},{"id": 2},{"id": 3}];
    $.post(
        "/insert_tc",
        {
          json_data: JSON.stringify(test),
          "type": 'clone',
          "csrfmiddlewaretoken": $csrf_token
        },  
        function(json) {
            //CALLBACK
        },
        "json"
    );  
    

    View:

    import json
    def insert_tc(request):
        if request.method == 'POST':       
            ret = request.POST
            type = ret['type']
            list = json.loads(ret['json_data'])
    

  • 7

    Это на самом деле JQuery, а не Django, будучи странным. Ваш

    test переменная не содержит JSON, но содержит объекты JS. jQuery по причинам, наиболее известным самому себе, перед публикацией анализирует это в какой-то очень странный формат, отсюда и результат, который вы получаете. Если вы сделали это вместо этого (обратите внимание на кавычки вокруг всего этого):

    var test = '[{"id": 1},{"id": 2},{"id": 3}]';
    

    Вы обнаружите, что получаете почти такой же ожидаемый QueryDict: единственное, что вам нужно сделать, это позвонитьjson.loads(ret['json_data']).

    Также по причинам, которые я не могу понять. jQuery не содержит никаких функций для преобразования вашего массива объектов в JSON. Для этого вам потребуется найти плагин или отдельную библиотеку.