【问题标题】:How can I pass my context variables to a javascript file in Django?如何将我的上下文变量传递给 Django 中的 javascript 文件?
【发布时间】:2012-01-30 19:40:10
【问题描述】:

这个问题一定很明显,但我想不通。

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

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

【问题讨论】:

标签: javascript django templates


【解决方案1】:

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

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

然后您的脚本可以引用my_chart

【讨论】:

  • @Brian_Neal 这是如何工作的?即,您可以在 javascript 文件中执行类似 console.log(my_chart); 的操作,而不必在任何地方声明它?
  • @YPCrumble 在 Django 生成的 html 中声明。如果同一个 html 文件还包含一个外部 javascript 文件,则该 javascript 可以引用该变量。
  • 这是一个绝妙的答案,只要在导入 js 文件之前声明全局变量,就可以了。谢谢。
【解决方案2】:

我认为这是不可能的。如果你想访问视图提供的一些数据,你必须将它传递给js函数。

例子

js文件:

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

查看

// some html code

my_cool_js_function({{param}})

希望这会有所帮助:)

【讨论】:

【解决方案3】:

我还要补充一点,因为我遇到了几次错误,如果 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);

【讨论】:

    【解决方案4】:

    现在有一种更安全的方法可以使用内置模板标签 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

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 2020-11-20
      • 2014-09-30
      • 2023-02-25
      • 1970-01-01
      • 2019-03-01
      • 2017-09-04
      相关资源
      最近更新 更多