-
Доброго всем дня.
Имеется форма отправки отзывов. Я дорабатываю ее, чтобы отправка отзыва осуществлялась без полной перезагрузки страницы. Все просто, на сабмит формы вешаем обработчик, который отправляет данные на сервер. Если ошибок нет, то отзыв сохраняем. В верх списка отзывов должен добавиться новый отзыв.
HTML-код нового отзыва формирует сервер, а скрипт лишь получает этот код и вставляет его в страницу. Для обмена данными используется JSON. Вот такие данные сервер возращает на страницу в случае успешного сохранения отзыва:
'status':'OK' - означает, что отзыв успешно сохраненdata = "{'status':'OK', 'new_response':'%s'}" % render_to_string('response_item.html', {'response': new_response})
return HttpResponse(data, mimetype="application/javascript")
'new_response' - это собственно html-код нового отзыва, он формируется на основе шаблона, в который передается объект нового отзыва (это собственно и вся соль передавать именно готовый html-код - один шаблон используется и для формирования основного списка отзывов и нового)
Проблемма в том, что на стороне клиента я не могу получить этот кусок html-кода. Получается, что передача html-а "ломает" JSON формат.
Шаблон response_item.html имеет следующий вид:
Клиент получает ответ такого вида:<div class="response_item">
<div class="submitted"><span class="author">{{ response.user }}</span> - {{ response.created }}</div>
<div class="mark"><span class="label">Общая оценка:</span> {{ response.mark }}</div>
<div class="comment">{{ response.comment }}</div>
</div>
Вот javascript-функция отправки-обработки данных:{'status':'OK', 'new_response':'<div class="response_item"><div class="submitted"><span class="author">vic</span> - July 24, 2010, 9:23 p.m.</div><div class="mark"><span class="label">Общая оценка:</span> 7</div><div class="comment">Отзыв отзыв отзыв</div></div>'}
Как правильно передавать куски html-кода?$.post('.?xhr', {'mark':mark, 'comment':comment}, function(data) {
var response = eval('('+data+')');
if (response.status == 'OK') {
$("#response .response_list").prepend(response.new_response);
}
else {
alert('Error');
}
});
Почему в моем случае скрипт не может обрабатывать отклик, переменных response.status и response.new_response как будто нет.
Я как понимаю, передача html-кода нарушает JSON формат. -
А вы json руками формируете? Или библиотекой соответствующей?
-
Формировал руками
Сейчас попробовл обернуть в функцию json.dumps - заработало:data = "{'status':'OK', 'new_response':'%s'}" % render_to_string('response_item.html', {'response': new_response})
return HttpResponse(data, mimetype="application/javascript")
Правильно ли я серилизовал данные, или можно еще лучше?from django.utils import simplejson as json
data = "{'status':'OK', 'new_response':%s}" % json.dumps(render_to_string('response_item.html', {'response': new_response}))
return HttpResponse(data, mimetype="application/javascript") -
А чем не устраивает полный вариант?
json.dumps({'status':'OK', 'new_response': msg}) -
лучше через dumps, зачем формировать строку, когда ее можно сформировать из dict:
result = {'success' : true, 'msg' : msg} json = simplejson.dumps(result) return HttpResponse(json, mimetype="application/json")
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

