2012-04-05 24 views
11

Jak przekazać złożoną strukturę JSON przez wywołanie AJAX z JS i po stronie serwera, odczytać ją jako "bardzo podobną" strukturę danych w pythonie?Django: Czytanie tablicy obiektów JSON z QueryDict

Rozumiem, że formatowanie json może być używane (simplejson itp.), Ale jakoś czuję, że sam QueryDict jest zniekształcony lub sformatowany w moim przypadku?

przykład:

Po przejściu przez szereg obiektów JSON [{ "id" 1}, { "id": 2}, { "id": 3}] poprzez AJAX widoku Django The QueryDict zostanie sformatowany jako:

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']}> 

Jak mogę nawet wykonać iterację w pliku json_data?

chcę dostać coś takiego zamiast:

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']> 

Tak, że można uzyskać dostęp QueryDict jako słownika i odzyskać json_data postaci listy i przetwarza je w określonej kolejności: może po prostu iterację nich sekwencyjny Lista zamówień. Coś jak:

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

W rzeczywistości wartość, że idzie do procesu() może być inny słownik par wartości kluczowych zamiast tylko numer (1,2,3 itd)

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) 

Ale lista zwraca puste []

Próbowałem zrzutów Simplejson, ładunków, przedmiotów, metod, ale żadna z nich nie pomogła.

Próbowałem nawet jQuery.param (obj, true), ale to nie jest to, czego chcę (chociaż trochę blisko).

Czy istnieje inny/lepszy sposób przekazywania złożonych struktur danych tam iz powrotem Django < -> JS za pośrednictwem AJAX?

+0

coś jest zdecydowanie nie tak, ponieważ kod jak pisał pewno nie daje to rezultatu QueryDict. Czy możesz podać dokładny kod, który to wypisze? –

+0

Obawiam się, że kod JS jest dokładny. Skopiowałem zarówno fragment kodu JS, jak i wynik żądania wydruku z pliku views.py z mniejszym formatowaniem. "test" to tablica obiektów, które mijam. – rajivRaja

+0

Przepraszam, mój błąd. Zobacz moją odpowiedź poniżej. –

Odpowiedz

12

Powinieneś uszeregować swój JSON za pomocą JSON.stringify(). Spowoduje to przekształcenie obiektu JSON w format ciągów, aby mógł zostać poprawnie przeanalizowany na drugim końcu. Z drugiej strony będziesz musiał użyć funkcji json.loads(), aby "unieruchomić" obiekt.

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" 
); 

Zobacz:

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

Dzięki! Chociaż odpowiedź Daniela była na czasie i naprawdę pomogła mi przejść przez przeszkodę, przechodzę do tego, aby być przyjętą odpowiedzią, ponieważ JSON.stringify() wykonuje to zadanie bardziej czysto. – rajivRaja

+1

JSON nie wydaje się być dostępny w starszych wersjach IE. Myślałem, że ktoś chciałby wiedzieć. Nadal wydaje się najlepszym sposobem, aby to zrobić. – misterte

7

To w rzeczywistości jQuery, a nie Django, jest dziwne. Twoja zmienna test nie zawiera JSON, ale rzeczywiste obiekty JS. jQuery, z powodów, które są najbardziej znane, analizuje to w bardzo dziwnym formacie przed opublikowaniem, stąd wynik, jaki otrzymujesz. Jeśli tak to zamiast (zwróć uwagę na cudzysłowy wokół całej sprawy):

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

chcesz znaleźć można dostać bardzo Prawie QueryDict się spodziewać: jedyną rzeczą, którą następnie trzeba zrobić, to zadzwonić json.loads(ret['json_data']).

Również z powodów, których nie mogę zrozumieć. jQuery nie zawiera żadnej funkcji do konwertowania tablicy obiektów na JSON. Musisz znaleźć wtyczkę lub oddzielną bibliotekę do tego.

+1

Moja wiara w ludzkość została przywrócona. Dziękuję Ci! Prawie udało mi się to uruchomić. Byłoby wspaniale poznać przyczynę tego zachowania (Niektóre z nich mogą być napisane?) – rajivRaja