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

2024-05-14 20:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: 文件djangosrc模板id内容scriptbody
3条回答

您也可以将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文件并使用a.variable1、a.variable2等。在你的javascript代码中。在

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

<script type='text/javascript'>
some_numeric_property = {{variable1}};
some_string_property = '{{variable2}}';
</script>

另一种方法是通过函数调用和data-属性传递所需的所有细节。例如,如果我希望某个链接在悬停时弹出一个带有用户配置文件的AJAX气泡,我可以这样做:

^{pr2}$

或者这样(假设我的脚本是用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)总是以“安全”格式(即数据来自于SlugFieldIntegerField或数据库中的某个东西),这是安全的。在

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

相关问题 更多 >

    热门问题