当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。

是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。


当前回答

Django 2.1+有一个很好的简单方法,使用内置的模板标签json_script实现。一个简单的例子是:

在模板中声明你的变量:

{{变量|json_script:'name'}}

然后调用你的<script> Javascript中的变量:

var js_variable = JSON.parse(document.getElementById('name').textContent);

对于像“User”这样更复杂的变量,使用Django内置的序列化器,你可能会得到类似“User类型的对象不是JSON可序列化的”这样的错误。在这种情况下,您可以使用Django Rest框架来支持更复杂的变量。

其他回答

对于作为文本存储在Django字段中的JavaScript对象,它需要再次成为动态插入到页面脚本中的JavaScript对象,您需要同时使用escapejs和JSON.parse():

var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");

Django的escapejs正确地处理引用,JSON.parse()将字符串转换回JS对象。

对于字典,最好先编码成JSON。你可以使用simplejson.dumps(),或者如果你想从App Engine中的数据模型转换,你可以使用GQLEncoder库中的encode()。

如果你想通过将变量作为参数直接发送给函数,那么试试这个

<input type="text" onkeyup="somefunction('{{ YOUR_VARIABLE }}')">

从前面的回答来看,安全性可以得到改进

有许多答案指向json_script。与人们可能认为的相反,这并不是一个万能的解决方案。

例如,当我们想要将在For循环中生成的动态变量传递给JavaScript时,最好使用data-attributes之类的东西。

点击这里查看更多细节。

Javascript中有两件事对我有用:

'{{context_variable|escapejs }}'

及其他: 在views.py

from json import dumps as jdumps

def func(request):
    context={'message': jdumps('hello there')}
    return render(request,'index.html',context)

在html中:

{{ message|safe }}