Заставить сообщения django появляться в предупреждениях Javascript, а не в html?

Я пытаюсь отображать сообщения пользователю при входе в систему / регистрации, используя функцию оповещения JavaScript. Я пытаюсь что-то вроде этого, но это не похоже на работу.

Каков правильный синтаксис для передачи переменных django в скрипт в шаблоне?

Это то, что я хочу, но этот синтаксис не работает.

{% if messages %}{% for message in messages %}<script>alert({{}});</script>{% endfor %}{% endif %}

Однако работает следующее:

{% if messages %}<ul>{% for message in messages %}
    <li>{{ message }}</li>
{% endfor %}</ul>{% endif %}

2 ответа

Django обрабатывает теги шаблонов перед обслуживанием Javascript - вы можете использовать теги в Javascript так же, как и в HTML, нет никакой разницы, поскольку все это поступает в переведенный клиент.

Например, вот что я использую:

<script>
        {% if messages %}
            {% for message in messages %}
                Materialize.toast('{{ message }}', 4000);
            {% endfor %}
        {% endif %}
</script>

В вашем случае это:

{% if messages %}
   <script>
    {% for message in messages %}
        alert("{{ message }}");
    {% endfor %}
   </script>
{% endif %}

Обратите внимание на цитаты вокруг {{ message }} - Javascript вернет ошибку, если ваше сообщение выглядит как alert(Hello World) вместо alert("Hello World"), Я также переместил скрипт за пределы цикла for, хотя не думаю, что ваш путь вызовет какие-либо проблемы.

Хотя имейте в виду, если есть несколько сообщений, отображение предупреждений для каждого из них может раздражать.

Не уверен, так как сейчас я не могу проверить, но это должно сработать:

{% if messages %}{% for message in messages %}<script>alert("{{ message }}");</script>{% endfor %}{% endif %}

Имейте в виду, что alert останавливает выполнение JavaScript, поэтому вы увидите одно предупреждение за раз. Если вы хотите, чтобы все сообщения были вместе, вы можете использовать:

{% if messages %}<script>alert("{% for message in messages %}{{ message }}\n{% endfor %}");</script>{% endif %}

(Опять не проверено)

Но проверьте это, я думаю, что это немного чище, чем другие решения, которые я предложил:

<script>
var messages = {{messages|jsonify}};
if (messages.length) alert(messages.join('\n'));
</script>
Другие вопросы по тегам