如何将我的上下文变量传递给Django中的javascript文件?

use*_*936 26 javascript django templates

这个问题必须明显,但我无法弄清楚.

在模板中,我链接到媒体目录中的js文件.从该文件中,我想访问像{{my_chart}}这样的上下文变量.

但是语法不同吗?谢谢!!

Bri*_*eal 25

除了Andrzej Bobak的回答,您还可以从模板中生成Javascript中的全局变量.例如,您的模板可能会生成如下代码:

<script>
   var my_chart = {{ the_chart }};
</script>
Run Code Online (Sandbox Code Playgroud)

然后你的脚本可以参考my_chart.

  • 这是很好的答案,只要你在导入js文件之前声明全局变量,你应该没问题.谢谢. (2认同)

And*_*bak 23

我认为不可能这样.如果要访问视图提供的某些数据,则必须将其传递给js函数.

js文件:

my_cool_js_function(some_param){
    // do some cool stuff
}
Run Code Online (Sandbox Code Playgroud)

视图

// some html code

my_cool_js_function({{param}})
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

  • 记得看看 [{{ value|escapejs }}](https://docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs) (3认同)

mas*_*imp 7

我还要补充一下,因为我多次遇到错误,如果python变量是一个对象,除非您将其放在引号中,换句话说,在模板中,否则它将引发语法错误,

<script>
   var my_var = '{{ python_object|escapejs }}';
</script>
Run Code Online (Sandbox Code Playgroud)

此外,在将该对象放入上下文之前,最好先将其序列化为JSON,否则最终将不得不进行字符串解析。我还发现在此步骤之前,日期对象需要转换为字符串。

import jsonpickle

context['python_object'] = jsonpickle.encode(python_object)
Run Code Online (Sandbox Code Playgroud)

最后,在JS中,您可以通过以下操作正确地遍历对象,并使用python中可能具有的值:

var my_var_parsed = jQuery.parseJSON(my_var);
Run Code Online (Sandbox Code Playgroud)


nam*_*ndy 5

现在有一种更安全的方法可以使用json_script带有参数的内置模板标记将上下文传递给 javascript 文件,该参数将是为创建的元素设置的 id。

用例是:

{{ mydata|json_script:"mydata" }}
Run Code Online (Sandbox Code Playgroud)

然后链接您的 javascript 文件:

<script src="{% static 'myjavascriptfile.js' %}"></script>
Run Code Online (Sandbox Code Playgroud)

我猜脚本标签必须在模板标签之后

然后可以在您的 javascript 文件中访问它,例如:

const mydata = JSON.parse(document.getElementById('mydata').textContent);
Run Code Online (Sandbox Code Playgroud)

来源

Django 3.1 文档 json_script

另一个有正确解释的来源