Как мне сделать это в Javascript и Django? - PullRequest
1 голос
/ 19 января 2011

Я привык размещать свои javascript-скрипты в верхней части моей страницы в разделе заголовка.В моем javascript я использую множество шаблонов от Django, таких как: {{ user.id }} {{ post.body }}

Я решил переместить свой javascript в другой файл, а затем импортировать его, используя: script src=

так как мой javascript находится в другом файле, теперь он не может читать мой шаблонный материал Django.

Что мне делать?У меня есть шаблон Django по всему javascript, и я должен переместить свой javascript в другой файл.

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Вы также можете создать свой javascript как шаблон!Но это требует обслуживания вашего динамического javascript через Django.

Например ..

#views
def some_js(request):
    return render_to_response('js/some_dynamic_js.js', {}, mimetype='text/javascript')

Ничто не говорит о том, что шаблоны Django должны быть HTML.Они просто способ шаблонизации текста.Код - это текст, поэтому он может быть шаблонным.Я делаю это в моем текущем проекте.

1 голос
/ 19 января 2011

Вы можете использовать массив JSON, как предложил Самет, или даже просто обычные переменные JS.

<script type='text/javascript'>
some_numeric_property = {{variable1}};
some_string_property = '{{variable2}}';
</script>

Другой способ сделать это (как я обычно это делаю) - передать все детали, которые вынужно через вызовы функций и data- атрибуты.Например, если бы я хотел, чтобы определенная ссылка открывала всплывающий пузырь AJAX с профилем пользователя при наведении, я мог бы сделать это:

<a href='/profile/{{user.id}}' onmouseover='show_user_popup({{user_id}})'>{{user.name}}</a>

или это (при условии, что мой сценарий прикреплял события к ссылкам с классами user-link):

<a href='/profile/{{user.id}}' class='user-link' data-uid='{{user_id}}'>{{user.name}}</a>

Вы также можете вызывать эти функции в head вашего HTML-кода сразу после загрузки, если хотите.

<script type='text/javascript' src='{{MEDIA_URL}}/js/whatever.js'></script>
<script type='text/javascript'>
do_something_with_a_number({{variable1}});
do_something_with_a_string('{{variable2}}');
</script>

Преимущество последнего состоит в том, чтопоскольку при загрузке файла JS код не выполняется (за исключением создания и связывания объектов function, очевидно), вы можете включить один файл JS на каждую страницу вашего сайта и просто вызывать нужные биты насоответствующие страницы.Этот один файл затем кэшируется после первой загрузки (при условии, что вы отправляете правильные заголовки), уменьшая время загрузки для последующих страниц.

РЕДАКТИРОВАТЬ: соображения безопасности: Метод I 'В описанном (наряду со многими другими методами на этой странице) предложено вставить данные в виде а) атрибутов тегов HTML или б) объектов JavaScript.Это безопасно, если вы знаете, что данные a) не могут быть установлены ненадежными пользователями или b) всегда в «безопасном» формате (т. Е. Данные поступают из SlugField или IntegerField или чего-то другого вбазы данных).

Однако, если ни один из этих случаев не подходит, вам нужно будет защитить от внедрения HTML и / или JS, экранируя соответствующие символы.Поведение Django по умолчанию для экранирования сущностей HTML может в некоторых случаях защитить вас, но не может, поэтому стоит проверить.

0 голосов
/ 19 января 2011

Дамп некоторого объекта JSON вверху страницы в теге сценария:

<script type='text/javascript'>
var a = {{ someJsonObject }}
</script>

Затем включите ваш отдельный файл javascript и используйте a.variable1, a.variable2 и т. Д. . в ваших кодах JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...