1. vic

    24.07.2010

    0 ↑
    0 ↓
    Доброго всем дня.

    Имеется форма отправки отзывов. Я дорабатываю ее, чтобы отправка отзыва осуществлялась без полной перезагрузки страницы. Все просто, на сабмит формы вешаем обработчик, который отправляет данные на сервер. Если ошибок нет, то отзыв сохраняем. В верх списка отзывов должен добавиться новый отзыв.

    HTML-код нового отзыва формирует сервер, а скрипт лишь получает этот код и вставляет его в страницу. Для обмена данными используется JSON. Вот такие данные сервер возращает на страницу в случае успешного сохранения отзыва:
      data = "{'status':'OK', 'new_response':'%s'}" % render_to_string('response_item.html', {'response': new_response})
    return HttpResponse(data, mimetype="application/javascript")
    'status':'OK' - означает, что отзыв успешно сохранен
    '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>
    Клиент получает ответ такого вида:
    {'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>'}
    Вот javascript-функция отправки-обработки данных:
    $.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');
    }
    });
    Как правильно передавать куски html-кода?
    Почему в моем случае скрипт не может обрабатывать отклик, переменных response.status и response.new_response как будто нет.
    Я как понимаю, передача html-кода нарушает JSON формат.
  2. Михаил

    24.07.2010

    0 ↑
    0 ↓
    А вы json руками формируете? Или библиотекой соответствующей?
  3. vic

    25.07.2010

    0 ↑
    0 ↓
    Формировал руками
    data = "{'status':'OK', 'new_response':'%s'}" % render_to_string('response_item.html', {'response': new_response})
    return HttpResponse(data, mimetype="application/javascript")
    Сейчас попробовл обернуть в функцию json.dumps - заработало:
    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")
    Правильно ли я серилизовал данные, или можно еще лучше?
  4. А чем не устраивает полный вариант?

    json.dumps({'status':'OK', 'new_response': msg})
    
  5. ildus

    25.07.2010

    1 ↑
    0 ↓

    лучше через dumps, зачем формировать строку, когда ее можно сформировать из dict:

    result = {'success' : true, 'msg' : msg}
    json = simplejson.dumps(result)
    return HttpResponse(json, mimetype="application/json")
    

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.