如何在Javascript和Django中实现这一点?

如何在Javascript和Django中实现这一点?,javascript,jquery,python,django,templates,Javascript,Jquery,Python,Django,Templates,我习惯于将javascripts放在页面顶部的head部分。在我的javascript中,我使用了很多来自Django的模板,比如:{{user.id}{{post.body} 我决定将我的javascript移到另一个文件中,然后使用:scriptsrc= 但由于我的javascript现在在另一个文件中,它无法读取我的Django模板内容 我该怎么办?我的javascript中到处都是Django模板,我必须将我的javascript移动到另一个文件。在页面顶部的脚本标记中转储一些JSON对

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

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

但由于我的javascript现在在另一个文件中,它无法读取我的Django模板内容


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

在页面顶部的脚本标记中转储一些JSON对象:

<script type='text/javascript'>
var a = {{ someJsonObject }}
</script>

var a={{someJsonObject}

然后包含单独的javascript文件,并使用a.variable1、a.variable2等。在javascript代码中。

您也可以将javascript生成为模板!但这需要通过Django提供动态javascript

例如

#views
def some_js(request):
    return render_to_response('js/some_dynamic_js.js', {}, mimetype='text/javascript')

没有任何规定Django模板必须是HTML。它们只是一种模板化文本的方式。代码是文本,因此可以对其进行模板化。我在当前的项目中这样做。

您可以按照Samet的建议使用JSON数组,甚至只使用常规JS变量

<script type='text/javascript'>
some_numeric_property = {{variable1}};
some_string_property = '{{variable2}}';
</script>
或者这样(假定我的脚本将事件附加到具有
用户链接类的链接上)

后者的优点是,因为加载JS文件时不会执行任何代码(显然,创建和绑定
函数
对象除外),所以您可以在站点的每个页面上包含一个JS文件,只需在适当的页面上调用所需的位即可。这一个文件将在第一次加载后被缓存(假设您发送了正确的头),从而减少后续页面的加载时间

编辑:安全注意事项:我描述的方法(以及本页上的许多其他方法)建议将数据作为a)HTML标记的属性或b)JavaScript实体插入。这是安全的,只要您知道数据a)不能由不受信任的用户设置,或b)始终是“安全”格式(即数据来自
SlugField
IntegerField
或数据库中的某些内容)


但是,如果两者都不是这样,则需要通过转义适当的字符来防止HTML和/或JS注入。Django默认的HTML实体转义行为在某些情况下可能会保护您,但可能不会,因此值得检查。

这将阻止用户缓存您的JavaScript,这可能会增加服务器上的负载。正确,但您可以进行服务器端缓存,所有因变量都包含在同一个文件中。@JoshSmeaton您需要像这样添加mimetype:
return render\u to\u response('js/some\u dynamic\u js.js',mimetype='text/javascript')
您可以编辑您的答案让其他人知道吗?@miernik,mimetype不需要让它工作,但它真的应该在那里,所以我把它包括进去了。干杯这里有安全漏洞吗?我真的不喜欢在HTML文档顶部包含外部JS文件所需的变量。我也愿意接受任何建议。@TIMEX这取决于您如何生成JSON。如果以内联方式执行(即
var a={foo:{{value1}}},bar:{{value2}};
存在JS注入漏洞(即
value1
可能是
”};顽皮JSCodehere();/*
顽皮JSCodehere()
将被执行)但是,如果您按照Samet的建议执行,并且
someJsonObject
是由
simplejson
或其他JSON库生成的字符串,则应该正确转义所有内容。绝对正确。动态更改javascript只是自找麻烦。
<a href='/profile/{{user.id}}' onmouseover='show_user_popup({{user_id}})'>{{user.name}}</a>
<a href='/profile/{{user.id}}' class='user-link' data-uid='{{user_id}}'>{{user.name}}</a>
<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>