Довольно долго мучился с выбором того, что выбрать для Django+ajax в своих проектах на django. Решил остановится на самом простом варианте- JS библиотеке jQuery
Подключаем её в шаблоне
Создаем файл, отвечающий за передачу csrf_token в POST запрос(Кто не знает что такое csrf - читать здесь на английском). Назовем его settings.js, пропишем в него:
При нажатии на кнопку мы перевернем текст введенный в текстовое поле уже с помощью django. Все, с клиентской частью покончено. Теперь нам нужно написать вьюху, которая наш запрос обработает. В views.py пишем:
Подключаем её в шаблоне
Создаем файл, отвечающий за передачу csrf_token в POST запрос(Кто не знает что такое csrf - читать здесь на английском). Назовем его settings.js, пропишем в него:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
xhr.setRequestHeader("Content-Type", 'application/x-www-form-urlencoded; charset=UTF-8');
}
}
});
Затем подключим его в шаблон:
Затем в шаблоне пропишем форму, к примеру:
<form action="" method="POST">
{% csrf_token %}
<input id="text-ajax" type="text" value="" />
<input id="clickme" type="button" value="Кликни меня" />
</form>
Далее подключим в шаблон следующий скрипт:
$(document).ready(function(){
$('#clickme').click(function(){
$.ajaxSetup({
success: function(data){
data = $.parseJSON(data);
alert(data['new-text']);
}
});
$.post('/ajax/test/', {'text': $('#test-ajax').val()});
});
При нажатии на кнопку мы перевернем текст введенный в текстовое поле уже с помощью django. Все, с клиентской частью покончено. Теперь нам нужно написать вьюху, которая наш запрос обработает. В views.py пишем:
from django.utils import simplejson
###simplejson обработывает словарь в json объект
def ajax_test(request):
context = {}
try:
data = request.POST['text'].strip()
except:
context['text'] = 'error'
else:
context['text'] = data[::-1]
return HttpResponse(context)
И добавляем url в urls.py
url(r'^ajax/test/$', ajax_test),Всё! Django теперь получит запрос по ajax. Вводим в строку в поле и при нажатии на кнопку получаем alert с этой строкой перевернутой задом наперед. А, да! Не забудьте передать в шаблон с формой context_instance. Например, если для генерации шаблона вы используете render_to_response, то выглядеть это будет так:
return render_to_response('template.html', {}, context_instance=RequestContext(request))
Это нужно для того, что бы сформировался csrf_token в шаблоне.
Вот и все, пока для связки django+ajax jquery я нахожу самым удобным.
Непонятно пишите...
ОтветитьУдалитьЧто именно не понятно? Буду рад более конкретным замечаниям ;-)
ОтветитьУдалитьПодскажите советом ,может кусочком кода : имеется вьюшки http://paste.ubuntu.com/5984016/ я не доконца уверен корректно ли они работают :). А если корректно , то реально ли использовать описанное в статье для получения json объекта из джанго в ajax , чтобы потом запускался js скрипт?
УдалитьВозвращает оно правильно. После parseJSON это будет json-объект. Правда последнюю вьюху можно укоротить, но тут уже сами подумайте как)
УдалитьМожно ли связать django+ajax без POST и GET?
ОтветитьУдалитьВот список методов: http://ru.wikipedia.org/wiki/HTTP#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4.D1.8B
ОтветитьУдалитьКаждый можно реализовать.
нерабочий гайд
ОтветитьУдалитьЧто именно у вас не заработало?
УдалитьVyacheslav Koslov, а как вам не понять, что здесь непонятного ?
ОтветитьУдалитьДавайте выяснять:
Подключаем её в шаблоне
1
...
Затем подключим его в шаблон:
1
И вот же вопрос - в тот же шаблон или другой? Если другой то какой, если тот же, то как строка может быть номером 1 и там и там и есчё где то там?
Понимать (за что жас уважаем) - это хорошо. А уметь понятливо обьяснять для непонимающих (здесь увы пока незачто уважать) это искуство.
Насчет этот или другой шаблон, Вы правы. А нумерация строк идет относительно текущего куска кода, а не общего шаблона, плагин который подсвечивает строки я не переписывал. Если буду писать еще подобные статьи - буду выкладывать примеры исходников в архиве. Что бы сразу "на примере".
УдалитьНасчет этот или другой шаблон, Вы правы. А нумерация строк идет относительно текущего куска кода, а не общего шаблона, плагин который подсвечивает строки я не переписывал. Если буду писать еще подобные статьи - буду выкладывать примеры исходников в архиве. Что бы сразу "на примере".
УдалитьДобрый день. Отличный гайд. Прошу помочь советом вот с такой проблемой.
ОтветитьУдалитьКак быть с базовым шаблоном, когда форма должна отрабатывать на любой странице сайта. Т.е. форму вывожу в базовом шаблоне через context_processor одного из приложений это понятно, но не решил вопрос с path (ulr по старому) для передачи во вьюху.