simplejson double экранирует данные, вызывая неверную строку JSON
У меня есть простая форма для управления производителями в моем магазине. После публикации формы вызов ajax возвращает json с обновленными данными в форму. Проблема в том, что возвращаемая строка неверна. Похоже, это был двойной выход. Странно похожий подход по всему магазину работает без проблем. Я также использую jquery 1.6 в качестве фреймворка для JavaScript.
Модель содержит 3 поля: символ для имени, текст для описания и поле для изображения логотипа производителя.
Функция:
def update_data(request, manufacturer_id):
"""Updates data of manufacturer with given manufacturer id.
"""
manufacturer = Manufacturer.objects.get(pk=manufacturer_id)
form = ManufacturerDataForm(request.FILES, request.POST, instance=manufacturer)
if form.is_valid():
form.save()
msg = _(u"Manufacturer data has been saved.")
html = [
["#data", manufacturer_data_inline(request, manufacturer_id, form)],
["#selectable-factories-inline", selectable_manufacturers_inline(request, manufacturer_id)],
]
result = simplejson.dumps({
"html": html
}, cls=LazyEncoder)
return HttpResponse(result)
Ошибка в консоли: ошибка с неверным JSON:
uncaught exception: Invalid JSON: {"html": [["#data", "\n<h2>Dane</h2>\n<div class="\"manufacturer-image\"">\n \n</div>\n<form action="\"/manage/update-manufacturer-data/1\"" method="\"post\"">\n \n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_name\"">Nazwa</label>:\n </div>\n \n \n <div class="\"error\"">\n <input id="\"id_name\"" name="\"name\"" maxlength="\"50\"" type="\"text\"">\n <ul class="\"errorlist\""><li>Pole wymagane</li></ul>\n </div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_image\"">Zdjecie</label>:\n </div>\n \n \n <div>\n <input name="\"image\"" id="\"id_image\"" type="\"file\"">\n </div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_description\"">Opis</label>:\n </div>\n \n \n <div>\n <textarea id="\"id_description\"" rows="\"10\"" cols="\"40\"" name="\"description\""></textarea>\n </div>\n \n </div>\n \n <div class="\"buttons\"">\n <input class="\"ajax-save-button" button\"="" type="\"submit\"">\n </div>\n</form>"], ["#selectable-factories-inline", "\n <div>\n <a class="\"selectable" selected\"\n="" href="%5C%22/manage/manufacturer/1%5C%22">\n L1\n </a>\n </div>\n\n <div>\n <a class="\"selectable" \"\n="" href="%5C%22/manage/manufacturer/4%5C%22">\n KR3W\n </a>\n </div>\n\n <div>\n <a class="\"selectable" \"\n="" href="%5C%22/manage/manufacturer/3%5C%22">\n L1TA\n </a>\n </div>\n\n"]]}
Есть идеи?
1 ответ
В текстовых областях json есть как двойная кавычка, так и ее html-кодировка. Например, все ваши атрибуты класса похожи на это в выводе ошибки:
class="\"e;classname\"e;"
Выше следует читать:
class=\"classname\"
Сырье json.dumps
выведет это:
>>> json.dumps(["#data", '<div class="classname"></div>'])
'["#data", "<div class=\\"classname\\"></div>"]'
Я подозреваю, что либо ваш manufacturer_data_inline
или же selectable_manufacturers_inline
звонки удваивают ваши цитаты "\"e;
или класс LazyEncoder делает что-то не так.