Возврат массива JSON из представления Django в шаблон
Я использую Django для создания веб-приложения для проекта, и у меня возникают проблемы с возвратом массива из представления Django в шаблон.
Массив будет использоваться скриптом JavaScript (JQuery) для рисования блоков на изображении, показанном на странице. Следовательно, этот массив будет, помимо прочего, иметь координаты для полей, которые нужно нарисовать.
Это код в представлении Django, используемый для получения необходимых данных и их сериализации в формате JSON:
def annotate(request, ...):
...
oldAnnotations = lastFrame.videoannotation_set.filter(ParentVideoLabel=label)
tags = serializers.serialize("json", oldAnnotations)
...
return render_to_response('vannotate.html', {'tags': tags, ...})
Как способ отладки, используя {{ tags }}
в HTML-части шаблона это выводится (извините за длинную строку):
[{"pk": 491, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 220, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 242}}, {"pk": 492, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 218, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 307}}]
я предполагаю, что это правильный формат для массива JSON.
Позже в шаблоне я пытаюсь использовать tags
переменная в части JavaScript шаблона, следующим образом:
{% if tags %}
var tagbs = {{ tags|safe }};
var tgs = JSON.parse(tagbs);
alert("done");
{% endif %}
Если я удалю var tgs = JSON.parse(tagbs);
строка, затем окно предупреждения появляется нормально, а остальная часть JavaScript работает как положено. Однако выход из этой строки нарушает сценарий.
Я хочу иметь возможность перебирать все объекты в модели Django и получать значения полей в JavaScript.
Я не уверен, что я делаю не так, может кто-нибудь указать правильный способ сделать это?
3 ответа
JSON - это исходный код Javascript. Т.е. JSON-представление массива - это исходный код Javascript, который вам нужен для определения массива.
Так после:
var tagbs = {{ tags|safe }};
tagbs
массив JavaScript, содержащий данные, которые вы хотите Нет необходимости вызывать JSON.parse(), потому что веб-браузер уже проанализировал его как исходный код JavaScript.
Так что вы должны быть в состоянии сделать
var tagbs = {{ tags|safe }};
alert(tagbs[0].fields.ParentVideoFile);
и это должно показать "4".
Вы хотите JSON-ify данные в шаблоне; JSON - это действительно Javascript (это подмножество:
{% if tags %}
var tgs = {{ tags }};
{% endif %}
Обратите внимание, что tags
это уже данные JSON (то есть JavaScript) и могут быть вставлены напрямую; не нужно убегать (здесь нет HTML, вместо этого JavaScript).
Или вы можете использовать этот фрагмент Django и сделать это прямо в шаблоне (не нужно вызывать serializers.serialize
в annotate
метод):
var tgs = {{ tags|jsonify }};
Вы также можете использовать simplejson
от django.utils
, Подобно:
oldAnnotations = lastFrame.videoannotation_set.filter(ParentVideoLabel=label)
dump = simplejson.dumps(oldAnnotations)
return HttpResponse(dump, mimetype='application/json')
Вы можете анализировать и получать все данные в этом со стороны JS.