您可以按照 Samet 的建议使用 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>
如果需要,您还可以在加载 HTML 后直接在 HTML 的 head 中调用这些函数。
<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 文件网站,只需在适当的页面上调用您需要的位。这个文件将在第一次加载后被缓存(假设您发送正确的标题),从而减少后续页面的加载时间。
编辑:安全考虑: 我所描述的方法(以及本页上的许多其他方法)建议将数据插入为 a) HTML 标记的属性或 b) JavaScript 实体。只要您知道数据 a) 不能由不受信任的用户设置或 b) 始终采用“安全”格式(即数据来自 SlugField 或 IntegerField 或其他数据库)。
但是,如果两者都不是,您需要通过转义适当的字符来防止 HTML 和/或 JS 注入。 Django 的 HTML 实体转义的默认行为在某些情况下可能会保护您,但可能不会,因此值得检查。