我习惯把我的javascripts放在head部分的页面顶部。在我的javascript中,我使用了很多来自Django的模板,例如:{{ user.id }} {{ post.body }}
我决定将我的javascript移到另一个文件中,然后使用:script src=
但是因为我的javascript现在在另一个文件中,所以它无法读取我的Django模板内容。
我该怎么办?我在整个javascript中都有Django模板,我必须将我的javascript移动到另一个文件。
答案 0 :(得分:2)
您也可以将javascript生成为模板!但这需要通过Django提供动态的JavaScript。
例如..
#views
def some_js(request):
return render_to_response('js/some_dynamic_js.js', {}, mimetype='text/javascript')
没有任何内容表明Django模板必须是HTML。它们只是模仿TEXT的一种方式。代码是文本,因此可以模板化。我在目前的项目中这样做。
答案 1 :(得分:1)
您可以使用Samet建议的JSON数组,甚至只使用常规的JS变量。
<script type='text/javascript'>
some_numeric_property = {{variable1}};
some_string_property = '{{variable2}}';
</script>
另一种方法(我通常采用的方式)是在via函数调用和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
或{{1}或者数据库中的某些东西。)
但是,如果这两种情况都不是这样,那么您需要通过转义相应的字符来防止HTML和/或JS注入。 Django的HTML实体转义的默认行为可能会在某些情况下保护你,但它可能没有,所以值得检查。
答案 2 :(得分:0)
在脚本标记中转储页面顶部的一些JSON对象:
<script type='text/javascript'>
var a = {{ someJsonObject }}
</script>
然后包含您单独的javascript文件,使用a.variable1,a.variable2等。在您的JavaScript代码中。