当我使用 Django 模板渲染器渲染页面时,我可以传入一个包含各种值的字典变量,以使用{{ myVar }}
.
有没有办法在 Javascript 中访问相同的变量(也许使用 DOM,我不知道 Django 如何使变量可访问)?我希望能够根据传入的变量中包含的值使用 AJAX 查找来查找详细信息。
当我使用 Django 模板渲染器渲染页面时,我可以传入一个包含各种值的字典变量,以使用{{ myVar }}
.
有没有办法在 Javascript 中访问相同的变量(也许使用 DOM,我不知道 Django 如何使变量可访问)?我希望能够根据传入的变量中包含的值使用 AJAX 查找来查找详细信息。
的{{variable}}
直接代入HTML。做一个查看源码;它不是“变量”或类似的东西。它只是呈现的文本。
话虽如此,您可以将这种替换放入您的 JavaScript 中。
<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
这为您提供了“动态”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 %}
<script type="text/javascript">
var someVar = {{ some_var | js }};
</script>
对我有用的解决方案是使用模板中的隐藏输入字段
<input type="hidden" id="myVar" name="variable" value="{{ variable }}">
然后以这种方式在javascript中获取值,
var myVar = document.getElementById("myVar").value;
从 Django 2.1 开始,专门为此用例引入了一个新的内置模板标记:json_script
.
https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script
新标签将安全地序列化模板值并防止 XSS。
Django 文档摘录:
安全地将 Python 对象输出为 JSON,包装在标签中,准备与 JavaScript 一起使用。
这是我很容易做的事情:我修改了我的模板的 base.html 文件并将其放在底部:
{% if DJdata %}
<script type="text/javascript">
(function () {window.DJdata = {{DJdata|safe}};})();
</script>
{% endif %}
然后,当我想在 javascript 文件中使用变量时,我创建了一个 DJdata 字典,并通过 json 将其添加到上下文中: context['DJdata'] = json.dumps(DJdata)
希望能帮助到你!