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

发布于 2024-10-12 21:52:18 字数 315 浏览 4 评论 0原文

我习惯将 JavaScript 放在页面顶部的头部。在我的 javascript 中,我使用了 Django 中的很多模板内容,例如: {{ user.id }} {{ post.body }}

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

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

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

I'm used to putting my javascripts in the top of my page in the head section. In my javascript, I use a lot of template stuff from Django like: {{ user.id }} {{ post.body }}

I decided to move my javascript into another file, and then import it using: script src=

But since my javascript is in another file now it can't read my Django template stuff.

What do I do? I have Django template stuff all over the javascript, and I must move my javascript to another file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迷乱花海 2024-10-19 21:52:19

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

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

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

Dump some JSON object at top of page in a script tag:

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

Then include your separate javascript file and use a.variable1, a.variable2 etc. in your javascript codes.

柠檬 2024-10-19 21:52:18

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

例如..

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

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

You can generate your javascript as a template too! But that requires serving your dynamic javascript via Django.

For instance..

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

There is nothing that says that Django templates must be HTML. They are simply a way of templating TEXT. Code is text, so it can be templated. I do this in my current project.

梦中的蝴蝶 2024-10-19 21:52:18

您可以按照 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 后直接在 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 或 < code>IntegerField 或数据库中的某些内容)。

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

You could use a JSON array as Samet suggested, or even just regular JS variables.

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

Another way to do it (the way I'd usually go) is to pass all the details you need in via function calls and data- attributes. For example, if I wanted a certain link to pop up an AJAX bubble with a user's profile on hover I might do this:

<a href='/profile/{{user.id}}' onmouseover='show_user_popup({{user_id}})'>{{user.name}}</a>

or this (presuming my script was attaching events to links with classes of user-link):

<a href='/profile/{{user.id}}' class='user-link' data-uid='{{user_id}}'>{{user.name}}</a>

You could also call these functions in the head of your HTML straight after loading it if desired.

<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>

The advantage of the latter is, because no code gets executed when you load the JS file (with the exception of creating and binding function objects, obviously), you can have the one JS file included on every page on your site, and just call the bits you need on the appropriate pages. This one file would then get cached after the first load (assuming you're sending the right headers), decreasing load times for subsequent pages.

EDIT: security considerations: The method I've described (along with many of the other methods on this page) suggest inserting data as either a) attributes of HTML tags or b) JavaScript entities. This is safe so long as you know the data either a) can't be set by untrusted users or b) is always in a "safe" format (ie the data comes from a SlugField or an IntegerField or something in the database).

However, if neither of those are the case, you'd need to protect against HTML and/or JS injection, by escaping the appropriate characters. Django's default behaviour of HTML entity escaping might protect you in some cases, but it might not, so it's worth checking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文