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

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


当前回答

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 }}

其他回答

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

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

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

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

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

注意,如果你想将一个变量传递给外部的.js脚本,那么你需要在你的script标记之前加上另一个声明全局变量的script标记。

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

<script type="text/javascript" src="{% static "scripts/my_script.js" %}"></script>

数据像往常一样在视图中的get_context_data中定义

def get_context_data(self, *args, **kwargs):
    context['myVar'] = True
    return context

我在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 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。

https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script

新标记将安全地序列化模板值并防止XSS。

Django文档摘录:

安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。