2017-01-16 4 views
1

Я программирую в oTree (это среда, основанная на Django для социальных экспериментов), и у меня есть следующая проблема. Я определил некоторые списки в Python, и я бы хотел их импортировать и использовать в HTML-шаблоне. Если я печатаю их в HTML, мне удастся увидеть их без каких-либо проблем, однако, как только мне нужно будет их использовать в Javascript, программа не сможет их прочитать, а одинарные кавычки элементов списка преобразуются в '. Список импортируется следующим образом: var filtered_elements = {{ array }};.Как читать список Python в Javascript [в шаблоне Django]

Я думаю, что проблема здесь, так как JS не может работать с ними. Есть ли у вас какие-либо предложения о том, как это сделать? Я рассматривал использование JSON, но, поскольку я новичок в программировании, я не могу понять, просто ли это пустая трата времени или есть более простой выход. Спасибо за ваши ответы!

ответ

2

Похоже, что ваши данные уже JSON, иначе вы получите одиночные кавычки и префиксы u. Таким образом, единственная проблема - автоадминирование Django; Вы можете отключить его с фильтром safe:

var filtered_elements = {{ array|safe }}; 
+0

Спасибо, это действительно похоже на работу. У меня создалось впечатление, что он уже может работать над JSON для хранения данных между модулями и шаблонами, но я еще не был уверен в этом ... – DenisDiderot

2

Данные должны быть JSON, вместо того, чтобы поместить список Python в контакт непосредственно, положить "array": json.dumps(array) в словаре контекста.

Строка JSON не нуждается в HTML-экранировании внутри тега, но для этого требуется экранирование JS! В противном случае какая-то строка может включать в себя что-то вроде </script><script>absolutely anything goes here... для запуска произвольного JavaScript, если JSON содержит пользовательские данные.

Так используйте |escapejs:

var filtered_elements = {{ array|escapejs}}; 
+1

Согласен. btw, на стороне python, когда вы вызываете render (или любой аналогичный метод), не забудьте использовать 'json.dumps()' (ujson или simplejson). json ориентирован на javascript, который обеспечивает сериализацию данных js-happy. – liuyruc

+0

Я не понимаю, предпочтительнее или безопасно, в чем разница? – DenisDiderot

+1

Обычно Django автоматически применяет экранирование HTML, вот что вы видели ('' '' '' '' и так далее. JavaScript не является HTML, поэтому вам это не нужно. '| safe' просто отмечает строку, которая уже сбежала, поэтому к ней не применяется escaping. '| escapejs' применяет вид escaping, который вам нужен для JS внутри тега'