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

时间:2011-12-30 20:45:39

标签: javascript django templates

这个问题必须明显,但我无法弄明白。

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

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

4 个答案:

答案 0 :(得分:21)

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

实施例

js file:

my_cool_js_function(some_param){
    // do some cool stuff
}

视图

// some html code

my_cool_js_function({{param}})

希望这有助于:)

答案 1 :(得分:19)

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

<script>
   var my_chart = {{ the_chart }};
</script>

然后您的脚本可以引用my_chart

答案 2 :(得分:5)

我还要添加,因为我遇到了错误几次,如果python变量是一个对象,它会抛出语法错误,除非你把它放在引号中,换句话说,在你的模板中,

<script>
   var my_var = '{{ python_object|escapejs }}';
</script>

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

import jsonpickle

context['python_object'] = jsonpickle.encode(python_object)

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

var my_var_parsed = jQuery.parseJSON(my_var);

答案 3 :(得分:3)

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

用例是:

{{ mydata|json_script:"mydata" }}

然后链接您的 javascript 文件:

<script src="{% static 'myjavascriptfile.js' %}"></script>

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

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

const mydata = JSON.parse(document.getElementById('mydata').textContent);

来源

django 3.1 docs json_script

Another source with a proper explanation