我将python列表传递给django模板,如下所示:
views.py
中的:
dat = [-77.448599999999999, 37.536900000000003, u'Virginia War Memorial', 1.0]
result={"dat":dat}
return render(request,'result_map.html', {'form': form,'result':result})
并在我的模板中:
var dat = {{ result.dat }}
但在渲染的html中我得到了:
var dat = [-77.448599999999999, 37.536900000000003, u'Virginia War Memorial', 1.0]
给出错误。
我怎样才能得到:
var dat = [-77.448599999999999, 37.536900000000003, 'Virginia War Memorial', 1.0]
感谢
答案 0 :(得分:1)
如果你想要原始字符串,我认为你需要通过safe
过滤器传递它:
{{ result.dat|safe }}
如果您想影响较大的模板块,也可以使用{% autoescape off %}
块。
答案 1 :(得分:0)
var dat = {{ result.dat }}
您尝试注入JavaScript,可能是在<script>
块中。您需要使用JavaScript语法格式化的输出,但是您将隐式地将Python列表转换为字符串,这将提供Python语法列表文字,而不是JavaScript。存在许多差异,包括列表中的文本(Unicode)字符串在Python 2中以u
为前缀而不是JS。
您还使用Django模板的默认自动转换,即HTML转义。这对于注入HTML内容是正确的,但是您要注入JavaScript,因此'
'
会出现错误的转义。您可以通过添加|safe
过滤器来避免这种情况,以避免HTML转义,但之后您根本没有转义,因此您的页面很容易受到脚本注入(跨站点脚本)的攻击。</ p>
将结构化值输出到<script>
块的正确方法是:
json.dumps
将其转换为JSON字符串<
替换字符串中的字符\u003C
的任何实例,以便不能使用字符</script>
从{转义{ {1}}阻止并注入HTML 您可以将这些操作合并到自定义过滤器中。不幸的是Django本身doesn't ship one。
更好的方法是避免注入JavaScript。而是使用标准转义将<script>
输出写入HTML文档,并使用DOM从那里读取它:
json.dumps
这使您可以将您的JS完全保留在HTML页面之外,这样您也可以使用更安全的return render(request, 'result_map.html', {'form': form, 'dat': json.dumps(dat)})
...
<body data-dat="{{ dat }}">
...
var dat= JSON.parse(document.body.getAttribute('data-dat'));
设置。