2012-08-01 15 views
8

Tak więc próbuję w zasadzie skonfigurować stronę internetową, na której użytkownik wybiera identyfikator, strona internetowa następnie wysyła informacje o identyfikatorze do Pythona, gdzie python używa identyfikatora do wysyłania zapytań do bazy danych, a następnie zwraca wynik do strony internetowej w celu wyświetlenia.Przekazywanie informacji z javascript do aplikacji django iz powrotem

Nie jestem do końca pewien, jak to zrobić. Wiem, jak użyć wywołania ajax, aby wywołać dane generowane przez Pythona, ale nie jestem pewien, jak przekazać początkowe informacje id do aplikacji django. Czy można powiedzieć, zapytaj o adres URL, np. ./app/id (IE/app/8), a następnie użyj informacji o adresie URL, aby podać Pythonowi informacje? W jaki sposób mogę edytować pliki urls.py i views.py?

Dzięki,

+0

To jest tylko standardowy adres URL/widok Django. Żądania Ajax nie różnią się od normalnych żądań w tym kontekście. –

+1

Pomimo (i właśnie z tego powodu) będąc podstawowym pytaniem o AJAX i Django, znalazłem to pytanie bardzo użyteczne. Tego typu pytania "jak zacząć" są trudne do znalezienia (nawet w podstawowych samouczkach do czytania i pisania) w StackOverflow i oszczędzają sporo wysiłku dla początkujących. Dzięki Xhassassin! – viridis

Odpowiedz

27

Mówisz o AJAX. AJAX zawsze wymaga 3 sztuk (technicznie, tylko dwa: Javascript ma podwójny obowiązek).

  1. klienta (JavaScript w tym przypadku) sprawia zażądania
  2. Server (Django widoku w tym przypadku) obsługuje żądania i wraca response
  3. Client (ponownie, Javascript) odbiera odpowiedź i robi coś z nim

Nie określiłeś preferowanego schematu, ale byłbyś szalony, aby zrobić AJAX bez jakiejś struktury JavaScript, więc wybiorę dla ciebie jQuery. Kod może być dość łatwo dostosować do każdej ramy javascript:

$.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){ 
    // do something with response 
}); 

Używam $.getJSON, który jest wygodną metodą jQuery, który wysyła żądanie GET do adresu URL i automatycznie analizuje odpowiedź jako JSON, przekształcając go w obiekt JavaScript przekazany tutaj jako data. Pierwszym parametrem jest adres URL, do którego zostanie wysłane zapytanie (więcej o tym w bicie), drugim parametrem jest obiekt JavaScript zawierający dane, które należy przesłać wraz z żądaniem (można go pominąć, jeśli nie trzeba wysyłać dowolne dane), a trzeci parametr to funkcja wywołania zwrotnego do obsługi odpowiedzi z serwera po pomyślnym zakończeniu. Ten prosty fragment kodu obejmuje części 1 i 3 wymienione powyżej.

Następną częścią jest twój przewodnik, który oczywiście będzie w tym przypadku widokiem Django.Jedynym warunkiem jest zdania, że ​​musi powrócić odpowiedź JSON:

from django.utils import simplejson 

def my_ajax_view(request): 
    # do something 
    return HttpResponse(simplejson.dumps(some_data), mimetype='application/json') 

Należy zauważyć, że pogląd ten nie podejmuje żadnych argumentów innych niż wymagane request. To trochę filozoficzny wybór. IMHO, w prawdziwym trybie REST, dane powinny być przekazywane z prośbą, a nie w adresie URL, ale inni mogą i nie zgadzają się. Ostateczny wybór należy do Ciebie.

Należy również zauważyć, że tutaj użyłem biblioteki simplejson Django, która jest optymalna dla typowych struktur danych Pythona (list, dykt, itp.). Jeśli chcesz zwrócić instancję modelu Django lub zestaw zapytań, powinieneś użyć biblioteki serializerów.

from django.core import serializers 
... 
data = serializers.serialize('json', some_instance_or_queryset) 
return HttpResponse(data, mimetype='application/json') 

Teraz masz widok, wszystko co musisz zrobić, to drut go na tam wzorce Django Django tak będzie wiedział jak trasa żądania.

urlpatterns += patterns('', 
    (r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'), 
) 

To gdzie ta różnica filozoficzna przychodzi Jeśli zdecydujesz się przekazać dane przez samego adresu URL, trzeba uchwycić go w wzorca adresu.

(r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'), 

Następnie zmodyfikować widok przyjąć ją jako argument:

def my_ajax_view(request, some_data): 

i wreszcie zmodyfikować metodę JavaScript AJAX w celu włączenia go w adresie URL:

$.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){ 

Jeśli pójść drogą przekazywania danych z żądaniem, to trzeba zadbać, aby go retreive prawidłowo w widoku:

def my_ajax_view(request): 
    some_data = request.GET.get('some_data') 
    if some_data is None: 
     return HttpResponseBadRequest() 

To powinno dać wam wystarczy wziąć na prawie każdy Funkcjonalność AJAX z Django. Coś innego polega na tym, w jaki sposób twój widok pobiera dane (tworzy je ręcznie, wysyła zapytania do bazy danych itp.) Oraz w jaki sposób twoja metoda zwrotna JavaScript obsługuje odpowiedź JSON. Kilka porad, które:

  1. Przedmiotem data będzie ogólnie być lista, nawet jeśli tylko jeden element jest włączone. Jeśli wiesz, że jest tylko jeden przedmiot, możesz po prostu użyć data[0]. W przeciwnym razie, należy użyć pętli for, aby uzyskać dostęp do każdego elementu:

    form (var i=0; i<data.length; i++) { 
        // do something with data[i] 
    } 
    
  2. Jeśli data lub data[i] jest obiektem (AKA słownik, hash, włączył-array, etc.), można uzyskać dostęp do wartości kluczy traktując klucze jako atrybuty, tj:

    data[i].some_key 
    
  3. Gdy mamy do czynienia z odpowiedzi JSON i AJAX w ogóle, to zazwyczaj najlepiej spróbować go bezpośrednio w przeglądarce pierwszy, dzięki czemu można zobaczyć dokładną odpowiedź i/lub zweryfikować strukturę odpowiedź. Aby wyświetlić odpowiedzi JSON w przeglądarce, najprawdopodobniej będziesz potrzebować wyjątku. JSONView (dostępny zarówno dla Firefox i Chrome) pozwoli mu zrozumieć JSON i wyświetlić go jak stronę internetową. Jeśli żądanie to jest GET, możesz przekazać dane do adresu URL w normalny sposób GET, stosując zapytanie, tj. http://mydomain.com/url/to/ajax/view/?some_data=foo. Jeśli jest to POST, potrzebujesz jakiegoś klienta testowego REST. RESTClient jest dobrym dodatkiem do Firefoksa. W Chrome możesz spróbować Postman.Doskonale nadają się również do nauki interfejsów API innych firm z Twittera, Facebooka itp.

+1

Bardzo szczegółowa odpowiedź Chris. Dobra robota! – Jens

+2

Dobra odpowiedź! Ale uważaj, django.utils.simplejson jest przestarzałe w Django 1.5+, jak podano w [Uwagi do wydania Django 1.5] (https://docs.djangoproject.com/en/1.5/releases/1.5-alpha-1/#system- wersja-simplejson-no-longer-used) – viridis

+0

https://docs.djangoproject.com/en/1.10/releases/1.5/#system-version-of-simplejson-no-longer-used – joshlsullivan

1

Tak, jest to możliwe. Jeśli przekażesz identyfikator jako parametr do widoku, którego użyjesz w swojej aplikacji, na przykład: def example_view (request,id) , a w urls.py możesz użyć czegoś takiego: url(r'^example_view/(?P<id>\d+)/', 'App.views.example_view').

Identyfikator w adresie URL /example_view_template/8 uzyska dostęp do wyniku za pomocą id, który jest związany z numerem 8. Podobnie jak w przypadku 8. rekordu konkretnej tabeli w bazie danych, na przykład.

+0

Haha, dzięki. Tak, rzecz? P to wszystko, czego potrzebowałem, znalazłem ją w samouczku django, jak kilka minut po tym, jak tutaj spytałem. – xhassassin

0

Informacje o przechwytywaniu informacji z zapytania/adresów URL w ajax, Zwykle można to zrobić tak, jak w zwykłych żądaniach django, sprawdzić url dispatcher docs i przeczytać o widokach django z oficjalnych dokumentów.

O tym, jak zwrócić odpowiedź, po prostu uchwycić parametry, przetworzyć żądanie, a następnie udzielić odpowiedzi z odpowiednim mimitype.

Czasem trzeba serialize lub konwersji danych do innego formatu jak JSON, które mogą być przetwarzane bardziej wydajnie w stronie klienta/js

Powiązane problemy