我如何在Javascript和Django中执行此操作?

时间:2011-01-19 09:35:59

标签: javascript jquery python django templates

我习惯把我的javascripts放在head部分的页面顶部。在我的javascript中,我使用了很多来自Django的模板,例如:{{ user.id }} {{ post.body }}

我决定将我的javascript移到另一个文件中,然后使用:script src=

导入它

但是因为我的javascript现在在另一个文件中,所以它无法读取我的Django模板内容。

我该怎么办?我在整个javascript中都有Django模板,我必须将我的javascript移动到另一个文件。

3 个答案:

答案 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代码中。