【问题标题】:Making django's messages appear in Javascript alert rather than html?让 django 的消息出现在 Javascript 警报而不是 html 中?
【发布时间】:2017-02-07 19:04:34
【问题描述】:
我正在尝试在用户使用 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 %}
【问题讨论】:
标签:
javascript
css
django
django-templates
django-messages
【解决方案1】:
不确定,因为我现在无法测试,但这应该可以:
{% 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 %}
(同样,未测试)
但是检查this,我认为它比我提出的其他解决方案更清洁:
<script>
var messages = {{messages|jsonify}};
if (messages.length) alert(messages.join('\n'));
</script>
【解决方案2】:
Django 在提供 Javascript 之前处理模板标签 - 您可以像使用 HTML 一样使用 Javascript 中的标签,没有区别,因为它全部到达客户端翻译。
例如,这是我使用的:
<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 }} 周围的引号 - 如果您的消息显示为 alert(Hello World) 而不是 alert("Hello World"),Javascript 将返回错误。我还将脚本移到了 for 循环之外,尽管我认为您的方式不会引起任何问题。
但请记住,如果有多条消息,为每条显示警报可能会很烦人。