проблема рендеринга строки Python Django - PullRequest
1 голос
/ 21 декабря 2009

Я пытаюсь отобразить строку в javascript (который обычно работает нормально для меня), вот мой код

HTML:

THE USER NAME IS : {{name}} has added app {{has_added_app}}

JAVA SCRIPT:

<script> 
    <!-- 
       var userName = {{name}}

HTML-версия работает, JavaScript терпит неудачу, когда я пробовал тот же рендеринг в Javascript ранее, и он работал.

Ответы [ 3 ]

8 голосов
/ 21 декабря 2009
var userName = {{name}}

Выходит, когда вы просматриваете исходный код HTML как:

var userName = Bob

Что является очевидной ошибкой: пропущенные кавычки. Но, просто заключив в кавычки:

var userName = '{{name}}';

недостаточно для общего случая. Что если строка содержит символ кавычки, обратную косую черту или символ новой строки? В лучшем случае ваше приложение падает. В худшем случае, дыра в безопасности между сайтами. Более того, символ & или < в имени также не будет отображаться должным образом, так как Django autoescape, вероятно, предположит, что он находится в не-CDATA HTML-контексте, и неуместно и -escape их.

Вместо этого используйте фильтр escapejs:

var userName = '{{name|escapejs}}';

В качестве альтернативы используйте кодировщик JSON для преобразования любого базового типа данных в буквальный формат JavaScript, а не просто в строку. В стандартной библиотеке 2.6 имеется json , но учтите, что в строках не должно быть символа <, поэтому для внедрения кода в элемент скрипта вам нужно будет экранировать его вручную, чтобы предотвратить </script> последовательность, заканчивающая элемент CDATA преждевременно.

1 голос
/ 21 декабря 2009

комментариев к JavaScript:

var userName = "{{name}}";
0 голосов
/ 21 декабря 2009

Помните, что шаблоны Django являются чисто текстовыми: они не «знают», что вы создаете Javascript. Вы должны включить кавычки, которые нужны Javascript, вокруг строкового литерала:

var userName = "{{name}}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...