这个问题必须明显,但我无法弄明白。
在模板中,我链接到媒体目录中的js文件。从该文件中,我想访问像{{my_chart}}这样的上下文变量。
但是语法不同吗?谢谢!!
答案 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);