当我使用Django模板渲染器渲染页面时,我可以传入包含各种值的字典变量,以便在页面中使用它们进行操作{{ myVar }}
.
有没有办法在Javascript中访问相同的变量(也许使用DOM,我不知道Django如何使变量可访问)?我希望能够使用基于传入的变量中包含的值的AJAX查找来查找详细信息.
的{{variable}}
直接代入HTML.做一个观察源; 它不是"变量"或类似的东西.它只是渲染文本.
话虽如此,您可以将这种替换放入JavaScript中.
这为您提供了"动态"javascript.
小心检查故障单#17419,了解有关在Django核心中添加类似标记的讨论,以及使用此模板标记和用户生成的数据引入的可能的XSS漏洞.来自amacneil的评论讨论了票证中提出的大部分问题.
我认为最灵活,最方便的方法是为要在JS代码中使用的变量定义模板过滤器.这样可以确保您的数据被正确转义,并且可以将其用于复杂的数据结构,例如dict
和list
.这就是为什么我写这个答案,尽管有很多赞成的答案已被接受.
以下是模板过滤器的示例:
// 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))
此模板过滤器将变量转换为JSON字符串.您可以像这样使用它:
// myapp/templates/example.html {% load js %}
对我有用的解决方案是使用模板中的隐藏输入字段
然后以这种方式获取javascript中的值,
var myVar = document.getElementById("myVar").value;
从Django 2.1开始,专门针对此用例引入了一个新的内置模板标记:json_script
。
https://docs.djangoproject.com/zh-CN/2.1/ref/templates/builtins/#json-script。
新标签将安全地序列化模板值并防止XSS。
对于字典,您最好先编码为JSON.您可以使用simplejson.dumps(),或者如果要从App Engine中的数据模型进行转换,可以使用GQLEncoder库中的encode().
这是我正在做的很容易:我修改了我的模板的base.html文件并将其放在底部:
{% if DJdata %} {% endif %}
然后,当我想在javascript文件中使用变量时,我创建了一个DJdata字典,并通过json将其添加到上下文中: context['DJdata'] = json.dumps(DJdata)
希望能帮助到你!