Django: переменные внутри статического тега

Вопрос здесь кажется очень похожим к моему; однако я попробовал то, что там было предложено, но в моем случае это не сработало, поэтому, возможно, мой вопрос все-таки другой.

В моем html-файле (в разделе <script></script> для Javascript) у меня есть:

var snd = new Audio("{% static 'updateMap/cual_es_su_nombre.mp3' %}");
snd.play();

который отлично воспроизводит mp3; однако я хотел бы иметь возможность заменить имя файла: cual_es_su_nombre.mp3 на переменную. Я получаю имена файлов с сервера.

Итак, первое, что я делаю, это загружаю имена файлов в массив Javascript:

var all_file_names = new Array();
{% for item in all_file_names_from_server %}
    all_file_names.push("{{ item |safe }}");
{% endfor %}

Тогда, в конечном счете, я хотел бы сделать это, например:

var snd = new Audio("{% static 'updateMap/'|add:all_file_names[0] %}");
snd.play();

Однако это не работает...


person Roronoa Zoro    schedule 17.02.2015    source источник
comment
Вы не можете смешивать переменные javascript в переменных шаблона django. Они выполняются в совершенно разное время.   -  person Yuji 'Tomita' Tomita    schedule 18.02.2015
comment
@Yuji'Tomita'Tomita, что ты предлагаешь мне делать?   -  person Roronoa Zoro    schedule 18.02.2015
comment
Что вы получите, когда сделаете это: {% static 'updateMap/'|add:all_file_names[0] %}   -  person joel goldstick    schedule 18.02.2015
comment
@joelgoldstick, я получаю expected %} ошибку, и если я создаю одну переменную: var test = 'something'; var snd = new Audio("{% static 'updateMap/'|add:test %}"); я получаю variableDoesNotExist ошибку   -  person Roronoa Zoro    schedule 18.02.2015


Ответы (1)


Механизм шаблонов Django полностью завершит рендеринг страницы, прежде чем передать ее в браузер. Вы можете использовать его для написания Javascript, но вы не можете получить к нему доступ из Javascript или способами, которые зависят от структур данных Javascript. Я думаю, что вам лучше всего было бы создать массив разрешенных статических URL-адресов, а не просто массив имен файлов (возможно, вместо этого массива, если вам не нужны оба). Что-то типа:

var all_file_names = new Array();
{% for item in all_file_names_from_server %}
    all_file_names.push("{{ item |safe }}");
    all_file_uris.push("{% static 'updateMap/'|add:item|safe %}");
{% endfor %}

Потом:

var snd = new Audio(all_file_uris[0]);
snd.play();
person Peter DeGlopper    schedule 17.02.2015
comment
Когда я делаю all_file_names_static.push("{% static 'updateMap/'|add:{{ item|safe }} %}");, я получаю Expected filter argument ошибку! - person Roronoa Zoro; 18.02.2015
comment
В браузере я получаю: add requires 1 arguments, 0 provided - person Roronoa Zoro; 18.02.2015
comment
Ах да, не нужно использовать {{...}} внутри тега {% static %}. Обновлено. - person Peter DeGlopper; 18.02.2015