Mówisz o AJAX. AJAX zawsze wymaga 3 sztuk (technicznie, tylko dwa: Javascript ma podwójny obowiązek).
- klienta (JavaScript w tym przypadku) sprawia zażądania
- Server (Django widoku w tym przypadku) obsługuje żądania i wraca response
- 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:
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]
}
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
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.
To jest tylko standardowy adres URL/widok Django. Żądania Ajax nie różnią się od normalnych żądań w tym kontekście. –
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