Заставить сообщения 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>