Когда я отрисовываю страницу, используя шаблонизатор Django, я могу передать словарную переменную, содержащую различные значения, чтобы манипулировать ими на странице с помощью {{ myVar }}
.
Есть ли способ получить доступ к той же переменной в Javascript (возможно, используя DOM, я не знаю, как Django делает переменные доступными)? Я хочу иметь возможность искать детали с помощью поиска AJAX на основе значений, содержащихся в переданных переменных.
escapejs
существует фильтр:escapejs('<>') -> u'\\u003C\\u003E'
ВНИМАНИЕ! Проверьте билет # 17419 для обсуждения добавления подобного тега в ядро Django и возможных уязвимостей XSS, появившихся при использовании этого тега шаблона с данными, созданными пользователем. Комментарий от amacneil обсуждает большинство проблем, поднятых в билете.
Я думаю, что наиболее гибкий и удобный способ сделать это - определить шаблонный фильтр для переменных, которые вы хотите использовать в коде JS. Это позволяет вам гарантировать, что ваши данные правильно экранированы, и вы можете использовать их со сложными структурами данных, такими как
dict
иlist
. Вот почему я пишу этот ответ, несмотря на то, что есть принятый ответ с большим количеством голосов.Вот пример шаблона шаблона:
Этот шаблон фильтров преобразует переменную в строку JSON. Вы можете использовать это так:
источник
safe
только оценивает значение как безопасное, без надлежащего преобразования и экранирования.function myWidget(config) { /* implementation */ }
в файле JS, а затем используете его на некоторых страницахmyWidget({{ pythonConfig | js }})
. Но вы не можете использовать его в файлах JS (как вы заметили), поэтому он имеет свои ограничения.Решение, которое сработало для меня, заключается в использовании скрытого поля ввода в шаблоне
Затем получить значение в JavaScript таким образом,
источник
По состоянию на Django 2.1, новый встроенный в шаблонный тег был введен специально для этого случая использования:
json_script
.https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script
Новый тег безопасно сериализует значения шаблона и защищает от XSS.
Отрывок из Django Docs:
источник
Вот что я делаю очень легко: я изменил файл base.html для своего шаблона и поместил его внизу:
затем, когда я хочу использовать переменную в файлах javascript, я создаю словарь DJdata и добавляю его в контекст с помощью json:
context['DJdata'] = json.dumps(DJdata)
Надеюсь, поможет!
источник
Для словаря лучше всего сначала кодировать в JSON. Вы можете использовать simplejson.dumps () или, если вы хотите конвертировать из модели данных в App Engine, вы можете использовать encode () из библиотеки GQLEncoder.
источник
Я столкнулся с вопросом о подобии, и ответ, предложенный С. Лоттом, работал на меня.
Тем не менее, я хотел бы указать на существенное ограничение реализации здесь. Если вы планируете поместить свой код JavaScript в другой файл и включить этот файл в свой шаблон. Это не сработает.
Это работает только тогда, когда вы используете основной шаблон и код JavaScript в одном файле. Вероятно, команда Django может решить эту проблему.
источник
Я тоже боролся с этим. На первый взгляд кажется, что вышеуказанные решения должны работать. Тем не менее, архитектура django требует, чтобы каждый html-файл имел свои собственные визуализированные переменные (то
{{contact}}
есть визуализируетсяcontact.html
, пока{{posts}}
идет, например,index.html
и так далее). С другой стороны,<script>
теги появляются после{%endblock%}
in,base.html
от которогоcontact.html
иindex.html
наследуются. Это в основном означает, что любое решение, включаяобязательно потерпит неудачу, потому что переменная и скрипт не могут сосуществовать в одном и том же файле.
Простое решение, которое я в конечном итоге придумал и сработало для меня, заключалось в том, чтобы просто обернуть переменную тегом с идентификатором, а затем обратиться к нему в файле js, например, так:
а потом:
и просто включить
<script src="static/js/somecode.js"></script>
в ,base.html
как обычно. Конечно, речь идет только о получении контента. Что касается безопасности, просто следуйте другим ответам.источник
.textContent
вместо.innerHTML
, потому что в противном случае сущности, которые закодированы в HTML, также будут частью переменной JS. Но даже тогда это не может быть воспроизведено 1: 1 (я не уверен).Для объекта JavaScript, хранящегося в поле Django в виде текста, который должен снова стать объектом JavaScript, динамически вставляемым в сценарий на странице, вам необходимо использовать
escapejs
иJSON.parse()
:Django
escapejs
правильно обрабатывает цитирование иJSON.parse()
преобразует строку обратно в объект JS.источник
Обратите внимание, что если вы хотите передать переменную во внешний скрипт .js, то вам нужно предшествовать вашему тегу скрипта с другим тегом скрипта, который объявляет глобальную переменную.
data
определяется в представлении, как обычно вget_context_data
источник
Я использую этот способ в Django 2.1 и работаю для меня, и этот способ безопасен (ссылка) :
Сторона Джанго:
Html сторона:
источник
вы можете собрать весь скрипт, где ваша переменная массива объявлена в строке, следующим образом:
это будет генерировать строку следующим образом
получив эту строку, вы должны отправить ее в шаблон
в шаблоне вы получаете его и интерпретируете его литературным способом как код htm, непосредственно перед кодом javascript, где он вам нужен, например
и ниже, это остальная часть вашего кода, имейте в виду, что переменная для использования в примере - data2
таким образом, вы будете сохранять тип данных, который в этом случае является договоренностью
источник
aaa
будет содержать только цифры, в противном случае возможен XSS (внедрение скрипта).В Javascript у меня сработали две вещи:
и другое: в views.py
и в HTML:
источник