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

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


当前回答

我在Django 2.1中使用这种方法,对我来说,这种方法是安全的(参考):

Django身边:

def age(request):
    mydata = {'age':12}
    return render(request, 'test.html', context={"mydata_json": json.dumps(mydata)})

Html:

<script type='text/javascript'>
     const  mydata = {{ mydata_json|safe }};
console.log(mydata)
 </script>

其他回答

我也一直在挣扎。表面上看,上述解决方案似乎是可行的。然而,django架构要求每个html文件都有自己的呈现变量(也就是说,{{contact}}呈现给contact.html,而{{posts}}呈现给e.g. index.html等等)。另一方面,<script>标记出现在base.html中的{%endblock%}之后,contact.html和index.html继承自base.html。这基本上意味着任何解包括

<script type="text/javascript">
    var myVar = "{{ myVar }}"
</script>

必然会失败,因为变量和脚本不能共存于同一个文件中。

我最终想出了一个简单的解决方案,对我来说,就是简单地用一个带有id的标签包装变量,然后在js文件中引用它,就像这样:

// index.html
<div id="myvar">{{ myVar }}</div>

然后:

// somecode.js
var someVar = document.getElementById("myvar").innerHTML;

和往常一样,在base.html中包含<script src="static/js/somecode.js"></script>。 当然,这只是关于获取内容。关于安全问题,请参考其他答案。

{{variable}}被直接替换到HTML中。做一个查看源码;它不是一个“变量”或类似的东西。它只是渲染文本。

话虽如此,您可以在JavaScript中加入这种替换。

<script type="text/javascript"> 
   var a = "{{someDjangoVariable}}";
</script>

这为您提供了“动态”javascript。

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

您可以组装整个脚本,其中数组变量是在字符串中声明的,如下所示:

views.py

    aaa = [41, 56, 25, 48, 72, 34, 12]
    prueba = "<script>var data2 =["
    for a in aaa:
        aa = str(a)
        prueba = prueba + "'" + aa + "',"
    prueba = prueba + "];</script>"

这将生成如下所示的字符串

prueba = "<script>var data2 =['41','56','25','48','72','34','12'];</script>"

获得该字符串后,必须将其发送到模板

views.py

return render(request, 'example.html', {"prueba": prueba})

在模板中,您接收到它,并以一种文学的方式将其解释为HTM代码,例如,就在需要它的javascript代码之前

模板

{{ prueba|safe  }}

下面是代码的其余部分,请记住在示例中使用的变量是data2

<script>
 console.log(data2);
</script>

这样就可以保持数据的类型,在本例中是一种安排

我在Django 2.1中使用这种方法,对我来说,这种方法是安全的(参考):

Django身边:

def age(request):
    mydata = {'age':12}
    return render(request, 'test.html', context={"mydata_json": json.dumps(mydata)})

Html:

<script type='text/javascript'>
     const  mydata = {{ mydata_json|safe }};
console.log(mydata)
 </script>