Довольно долго мучился с выбором того, что выбрать для 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 по старому) для передачи во вьюху.