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。 这样可以确保您的数据正确转义,并且可以将其用于复杂的数据结构,如dict
和list
。 这就是为什么我写了这个答案,尽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时,所有的引号都变成"
。 使用{{someDjangoVariable|safe}}
会导致Javascript错误。
要解决这个使用Javascript .replace
:
<script type="text/javascript"> var json = "{{someDjangoVariable}}".replace(/"/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对象,则需要同时使用escapejs
和JSON.parse()
:
var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");
Django的escapejs
正确地处理引用, JSON.parse()
将string转换回JS对象。
- 如何使用Google App Enginepipe理第三方Python库? (virtualenv?pip?)
- DistutilsOptionError:必须提供家庭或前缀/ exec-前缀 – 不是两个
- 谷歌应用程序引擎中的自定义身份validation(Python)
- 如何正确输出JSON与应用程序引擎Python webapp2?
- Google Blobstore与Google云端存储
- 应用引擎默认的Django版本更改
- 用于Google App Engine的Flask vs webapp2
- 春季 – POST后redirect(即使有validation错误)
- UnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xe5:序号不在范围内(128)