Django模板variables和Javascript

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

有没有办法在Javascript中访问相同的variables(也许使用DOM,我不知道Django如何使variables可访问)? 我希望能够根据传入variables中包含的值使用AJAX查找来查找详细信息。

{{variable}}被直接replace成HTML。 做一个查看来源; 它不是一个“variables”或类似的东西。 这只是呈现文字。

话虽如此,你可以把这种replace到你的JavaScript。

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

这给你“dynamic”的JavaScript。

小心关于在Django核心中添加类似标签的讨论和#17419的讨论,以及使用这个模板标签和用户生成的数据引入的可能的XSS漏洞。 amacneil的评论讨论了票中提出的大部分问题。


我认为这样做的最灵活和方便的方法是为JS代码中要使用的variables定义一个模板filter。 这样可以确保您的数据正确转义,并且可以将其用于复杂的数据结构,如dictlist 。 这就是为什么我写了这个答案,尽pipe有许多upvotes公认的答案。

这是一个模板filter的例子:

 // myapp/templatetags/js.py from django.utils.safestring import mark_safe from django.template import Library import json register = Library() @register.filter(is_safe=True) def js(obj): return mark_safe(json.dumps(obj)) 

这个模板filter将variables转换为JSONstring。 你可以这样使用它:

 // myapp/templates/example.html {% load js %} <script type="text/javascript"> var someVar = {{ some_var | js }}; </script> 

为我工作的解决scheme是使用模板中隐藏的input字段

 <input type="hidden" id="myVar" name="variable" value="{{ variable }}"> 

然后通过这种方式获取javascript值,

 var myVar = document.getElementById("myVar").value; 

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

当Django返回variables时,所有的引号都变成&quot; 。 使用{{someDjangoVariable|safe}}会导致Javascript错误。

要解决这个使用Javascript .replace

 <script type="text/javascript"> var json = "{{someDjangoVariable}}".replace(/&quot;/g,"\"") </script> 

这是我很容易做的事情:我修改我的base.html文件为我的模板,并把它放在底部:

 {% if DJdata %} <script type="text/javascript"> (function () {window.DJdata = {{DJdata|safe}};})(); </script> {% endif %} 

然后当我想要在JavaScript文件中使用一个variables,我创build一个DJdata字典,我将它添加到上下文由json: context['DJdata'] = json.dumps(DJdata)

希望能帮助到你!

我正面临着类似的问题,S.Lott提出的答案为我工作。

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

不过,我想在这里指出主要的实施限制 。 如果您打算将您的JavaScript代码放在不同的文件中,并将该文件包含在您的模板中。 这是行不通的。

这只有当你的主要模板和JavaScript代码在同一个文件中才有效。 大概django团队可以解决这个限制。

对于作为文本存储在Django字段中的JavaScript对象,需要再次成为一个dynamic插入到页面脚本中的JavaScript对象,则需要同时使用escapejsJSON.parse()

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

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