我如何在Javascript和Django中做到这一点?
我习惯把我的JavaScript代码放在网页的顶部,也就是
部分。在我的JavaScript里,我用到了很多Django的模板内容,比如:{{ user.id }} {{ post.body }}
我决定把JavaScript代码移到另一个文件里,然后用script src=
来引入这个文件。
但是因为我的JavaScript现在在另一个文件里,它就无法读取Django的模板内容了。
我该怎么办呢?我的JavaScript里到处都是Django的模板内容,而我必须把JavaScript移到另一个文件里。
3 个回答
你可以像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的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实体转义在某些情况下可能会保护你,但也可能不会,所以最好检查一下。
你也可以把你的JavaScript当作模板来生成!不过这需要通过Django来提供动态的JavaScript。
比如说……
#views
def some_js(request):
return render_to_response('js/some_dynamic_js.js', {}, mimetype='text/javascript')
其实没有规定Django模板一定要是HTML。它们只是用来处理文本的一种方式。代码也是文本,所以也可以用模板来处理。我在我现在的项目中就是这么做的。
在页面顶部输出一些JSON对象,可以在一个脚本标签里写:
<script type='text/javascript'>
var a = {{ someJsonObject }}
</script>
然后引入你单独的JavaScript文件,在你的JavaScript代码中可以使用 a.variable1, a.variable2 等等。