Chociaż nie jest to całkowicie w duchu SO, uwielbiam to pytanie, ponieważ miałem takie same problemy, kiedy zaczynałem, więc dam ci krótki przewodnik. Oczywiście nie rozumiesz zasad leżących u ich podstaw (nie bierz tego za obrazę, ale jeśli byś to zrobił, nie pytałbyś).
Django jest po stronie serwera . To znaczy, powiedzmy, że klient idzie do adresu URL, masz w sobie funkcję, views
która renderuje to, co widzi i zwraca odpowiedź w HTML. Podzielmy to na przykłady:
views.py:
def hello(request):
return HttpResponse('Hello World!')
def home(request):
return render_to_response('index.html', {'variable': 'world'})
index.html:
<h1>Hello {{ variable }}, welcome to my awesome site</h1>
urls.py:
url(r'^hello/', 'myapp.views.hello'),
url(r'^home/', 'myapp.views.home'),
To przykład najprostszego użycia. Przejście do 127.0.0.1:8000/hello
oznacza żądanie do hello()
funkcji, przejście 127.0.0.1:8000/home
zwróciindex.html
i zastąpienie wszystkich zmiennych zgodnie z zapytaniem (prawdopodobnie już to wszystko znasz).
Porozmawiajmy teraz o AJAX . Wywołania AJAX to kod po stronie klienta, który wykonuje żądania asynchroniczne. To brzmi skomplikowanie, ale oznacza to po prostu, że wykonuje zapytanie w tle, a następnie obsługuje odpowiedź. Więc kiedy wykonujesz wywołanie AJAX dla jakiegoś adresu URL, otrzymujesz te same dane, które uzyskałbyś jako użytkownik jadący do tego miejsca.
Na przykład wywołanie AJAX 127.0.0.1:8000/hello
zwróci to samo, co gdybyś go odwiedził. Tylko tym razem masz go wewnątrz funkcji JavaScript i możesz sobie z tym poradzić, jak chcesz. Spójrzmy na prosty przypadek użycia:
$.ajax({
url: '127.0.0.1:8000/hello',
type: 'get', // This is the default though, you don't actually need to always mention it
success: function(data) {
alert(data);
},
failure: function(data) {
alert('Got an error dude');
}
});
Ogólny proces jest następujący:
- Połączenie przechodzi na adres URL
127.0.0.1:8000/hello
, jakbyś otworzył nową kartę i zrobił to sam.
- Jeśli się powiedzie (kod stanu 200), wykonaj funkcję powodzenia, która ostrzeże otrzymane dane.
- Jeśli się nie powiedzie, wykonaj inną funkcję.
Co by się tu stało? Pojawi się ostrzeżenie z „witaj światem”. Co się stanie, jeśli wykonasz połączenie AJAX do domu? To samo, dostaniesz ostrzeżenie<h1>Hello world, welcome to my awesome site</h1>
.
Innymi słowy - nie ma nic nowego w połączeniach AJAX. Są po prostu sposobem na to, aby użytkownik mógł uzyskać dane i informacje bez opuszczania strony, a to zapewnia płynny i bardzo schludny projekt witryny. Kilka wskazówek, które należy wziąć pod uwagę:
- Dowiedz się jQuery . Nie mogę tego wystarczająco podkreślić. Musisz trochę to zrozumieć, aby wiedzieć, jak obsługiwać otrzymywane dane. Musisz także zrozumieć podstawową składnię JavaScript (niedaleko Pythona, przyzwyczaisz się). Zdecydowanie polecam samouczki wideo Envato dla jQuery , są świetne i wprowadzą cię na właściwą ścieżkę.
- Kiedy używać JSON? . Zobaczysz wiele przykładów, w których dane wysyłane przez widoki Django są w JSON. Nie wdałem się w to szczegółowo, ponieważ nie jest ważne, jak to zrobić (jest mnóstwo wyjaśnień) i dużo ważniejsze, kiedy . Odpowiedź brzmi: dane JSON to dane serializowane. To znaczy dane, którymi możesz manipulować. Jak wspomniałem, wywołanie AJAX pobierze odpowiedź tak, jakby użytkownik zrobił to sam. Teraz powiedz, że nie chcesz zadzierać z całym plikiem HTML, a zamiast tego chcesz wysyłać dane (być może listę obiektów). JSON jest do tego dobry, ponieważ wysyła go jako obiekt (dane JSON wyglądają jak słownik Pythona), a następnie możesz iterować nad nim lub zrobić coś innego, co eliminuje potrzebę przesiewania przez bezużyteczny HTML.
- Dodaj to na końcu . Kiedy budujesz aplikację internetową i chcesz wdrożyć AJAX - zrób sobie przysługę. Po pierwsze, zbuduj całą aplikację całkowicie pozbawioną AJAX. Sprawdź, czy wszystko działa. Wtedy i tylko wtedy zacznij pisać wywołania AJAX. To dobry proces, który pomaga ci się dużo nauczyć.
- Użyj narzędzi programistycznych Chrome . Ponieważ wywołania AJAX są wykonywane w tle, czasami bardzo trudno jest je debugować. Powinieneś użyć narzędzi programistycznych chrome (lub podobnych narzędzi, takich jak firebug) i
console.log
rzeczy do debugowania. Nie wyjaśnię szczegółowo, po prostu google i dowiedz się o tym. Byłoby ci bardzo pomocne.
- Świadomość CSRF . Na koniec pamiętaj, że żądania postów w Django wymagają
csrf_token
. W przypadku połączeń AJAX wiele razy chcesz wysyłać dane bez odświeżania strony. Prawdopodobnie napotkasz jakieś problemy, zanim w końcu to pamiętasz - poczekaj, zapomniałeś wysłać csrf_token
. Jest to znana blokada dla początkujących w integracji AJAX-Django, ale kiedy nauczysz się, jak sprawić, by gra była przyjemna, to proste.
To wszystko, co przychodzi mi do głowy. To rozległy temat, ale tak, prawdopodobnie nie ma wystarczająco wielu przykładów. Po prostu pracuj tam, powoli, w końcu to dostaniesz.
csrf_token
, czy możemy obejść tę metodę? Gdybyśmy mieli przykładową funkcję,ajaxCall()
moglibyśmy po prostu użyć tradycyjnej metody czegoś takiego<form onsubmit='ajaxCall();return false;'>
, prawda?Oprócz doskonałej odpowiedzi yuvi, chciałbym dodać mały konkretny przykład, jak sobie z tym poradzić w Django (poza wszelkimi używanymi js). W przykładzie użyto
AjaxableResponseMixin
i przyjęto model autora.Źródło: Dokumentacja Django, Obsługa formularzy z widokami klasowymi
Link do wersji 1.6 Django nie jest już dostępny, zaktualizowany do wersji 1.11
źródło
Piszę to, ponieważ przyjęta odpowiedź jest dość stara, wymaga odświeżenia.
W ten sposób zintegrowałbym Ajax z Django w 2019 roku :) I weźmy prawdziwy przykład tego, kiedy będziemy potrzebować Ajax: -
Powiedzmy, że mam model z zarejestrowanymi nazwami użytkowników i przy pomocy Ajax chcę wiedzieć, czy dana nazwa użytkownika istnieje.
HTML:
ajax:
urls.py:
views.py:
Również render_to_response, który jest przestarzały i został zastąpiony przez render, a od Django 1.7 i później zamiast HttpResponse używamy JsonResponse do odpowiedzi ajax. Ponieważ jest wyposażony w koder JSON, więc nie trzeba serializować danych przed zwróceniem obiektu odpowiedzi, ale
HttpResponse
nie jest on przestarzały.źródło
Prosty i ładny. Nie musisz zmieniać swoich poglądów. Bjax obsługuje wszystkie Twoje linki. Sprawdź to: Bjax
Stosowanie:
Na koniec dołącz to do HEAD swojego html:
Aby uzyskać więcej ustawień, sprawdź demo tutaj: Bjax Demo
źródło
AJAX to najlepszy sposób wykonywania zadań asynchronicznych. Wykonywanie połączeń asynchronicznych jest czymś powszechnym w każdym budynku witryny. Podamy krótki przykład, aby dowiedzieć się, jak możemy wdrożyć AJAX w Django. Musimy użyć jQuery, aby napisać mniej javascript.
To jest przykład kontaktu , który jest najprostszym przykładem, którego używam do wyjaśnienia podstaw AJAX i jego implementacji w Django. W tym przykładzie będziemy składać żądanie POST. Podążam za przykładem tego postu: https://djangopy.org/learn/step-up-guide-to-implement-ajax-in-django
models.py
Najpierw stwórzmy model kontaktu, zawierający podstawowe szczegóły.
forms.py
Utwórz formularz dla powyższego modelu.
views.py
Widoki wyglądają podobnie do podstawowego widoku tworzenia opartego na funkcjach, ale zamiast wracać z renderowaniem, używamy odpowiedzi JsonResponse.
urls.py
Utwórzmy trasę powyższego widoku.
szablon
Przechodząc do sekcji frontonu, renderuj formularz utworzony powyżej otaczającego tagu formularza wraz z csrf_token i przyciskiem Prześlij. Pamiętaj, że zawarliśmy bibliotekę jquery.
JavaScript
Porozmawiajmy teraz o części javascript, na formularzu prześlijmy składamy zapytanie ajaxowe typu POST, pobieramy dane formularza i wysyłamy na stronę serwera.
To tylko podstawowy przykład, aby zacząć korzystać z AJAX z django, jeśli chcesz nurkować z kilkoma innymi przykładami, możesz przejść przez ten artykuł: https://djangopy.org/learn/step-up-guide-to- implement-ajax-in-django
źródło
Próbowałem użyć AjaxableResponseMixin w moim projekcie, ale otrzymałem następujący komunikat o błędzie:
Wynika to z faktu, że CreateView zwróci odpowiedź przekierowania zamiast zwracać odpowiedź HttpResponse podczas wysyłania żądania JSON do przeglądarki. Wprowadziłem więc kilka zmian w
AjaxableResponseMixin
. Jeśli żądanie jest żądaniem ajax, nie wywołasuper.form_valid
metody, wystarczy wywołaćform.save()
bezpośrednio.źródło
Kiedy używamy Django:
Jeśli chcesz zachować stare dane, możesz to zrobić bez Ajax. (Strona zostanie odświeżona)
Lub możesz zrobić z Ajax (Strona nie zostanie odświeżona)
Jeśli używasz Ajax, musisz wykonać następujące czynności:
Django różni się od Ajax. Przyczyna tego jest następująca:
Moim zdaniem, jeśli chcesz używać wszędzie ajax. kiedy musisz najpierw zainicjować stronę danymi, możesz użyć Django z Ajax. Ale w niektórych przypadkach potrzebujesz tylko strony statycznej bez niczego z serwera, nie musisz używać szablonu Django.
Jeśli nie uważasz, że Ajax jest najlepszą praktyką. możesz użyć szablonu Django, aby zrobić wszystko, na przykład anime.
(Mój angielski nie jest dobry)
źródło