AJAX и Django + jQuery

Приведу Вам сегодня несколько примеров о том, как осуществлять функциональность AJAX в django приложении, используя библиотека jQuery JavaScript. Скажу сразу, что эта статья относится к версии Django 1.1 или новее и направлена на новичков Django, подобно мне :).

В отличие от некоторых других сетевых приложений, Django, слава Богу  не привязан к какой-либо библиотеке JavaScript, и Вы можете использовать любую на свое усмотрение. Однако, В этой статье я буду использовать jQuery ради простоты.



Базовый пример Django и ajax


Давайте начнем с очень простого кода в views.py вашего приложения

from django.http import HttpResponse

def xhr_test(request):
if request.is_ajax():
message = "Hello AJAX"
else:
message = "Hello"
return HttpResponse(message)

# Ваш образец URL может быть простым, как
(r'^xhr_test$','your_project.your_app.views.xhr_test'),



jQuery и большинство других "серьезных" библиотек установит HTTP_X_REQUESTED_WITH заголовок "XMLHttpRequest" (XHR) для Вас, тогда Django is_ajax() метод вернет true. Теперь, когда вы можете определить способ запроса, использование ajax становится проще для написания представлений и форм.

JQuery часть


$(function() {
$.get("/sandbox/xhr_test", function(data) {
alert(data);
});
});



Посылка POST Данных


Вот еще один пример того как Вы можете отправить POST-данные в представление.

$.post("/sandbox/xhr_test", {
name: "Berg",
food: "Code"
},
function(data) {
alert(data);
}
);


Теперь вы можете получить доступ к посланным данным, в вашем представлении. Это хорошая практика, чтобы проверять, например, что метод запроса именно POST на самом деле, прежде чем пытаться получить доступ к данным.

from django.http import HttpResponse

def xhr_test(request):
if request.is_ajax():
if request.method == 'GET':
message = "This is an XHR GET request"
elif request.method == 'POST':
message = "This is an XHR POST request"
# Здесь мы можем обратиться к POST данным
print request.POST
else:
message = "No XHR"
return HttpResponse(message)




JSON и XML


При работе с AJAX, обычно хотят вернуть что-то более полезное, чем простой текст. Давайте изменим нашу выше функцию возврата Django объекта преобразовывая результат в формат JSON или XML.


from django.http import HttpResponse
from django.core import serializers
from your_app.models import ExampleModel

def xhr_test(request, format):
if request.is_ajax():
if format == 'xml':
mimetype = 'application/xml'
if format == 'json':
mimetype = 'application/javascript'
data = serializers.serialize(format, ExampleModel.objects.all())
return HttpResponse(data,mimetype)
# Если вы хотите предотвратить не XHR вызовы
else:
return HttpResponse(status=400)

# urls.py
(r'^xhr_test/(?P<format>\w+)/$','your_project.your_app.views.xhr_test'),



Теперь вы можете сделать запрос например /xhr_test/xml для ответа XML или /xhr_test/json для ответа JSON, если запрос не AJAX, тогда вернется ошибка HTTP 400 - плохой заголовок запроса.

Python и JSON


Python имеет JSON модуль, но Django уже идет с simplejson. Более того, словари Python  очень похожы на структуру данных JSON, что делает их взаимодействие еще проще.  Запустите  "Python manage.py shell" в корне проекта  и попробуйте следующее:

>>> from django.utils import simplejson
>>> test_dict = {'a': 1, 'b': 2, 'john' : 'done', 'jane' : 'doe'}
>>> simplejson.dumps(test_dict)
'{"a": 1, "john": "done", "b": 2, "jane": "doe"}'


Эта статья охватывает только самое основное. Ниже еще очень много о том, как обрабатывать ответ в JQuery правильно и как сериализовать объекты в Django. Я могу порекомендовать вам взглянуть на следующие статьи для дополнительной информации:

Ну вот пожалуй и все :).

Следующая запись

Предыдущая запись

Связанные записи

Похожие записи

Комментарии

Еще нет комментариев.

Пингбэки

Оповещения открыты.

Трэкбэки

URL архива

Only authorized users can post comments