第一篇文章;我会尽量保持这种简短和甜蜜。
我正在尝试渲染一个编辑表单,如果这些字段的值已存在,则检测并填充输入字段。我正在使用带有jinja2的烧瓶,当我使用{{ }}
打印操作符时,我的字段的双引号和&符号分别呈现为"
和&
。
捕获:这只发生在javascript函数中使用print运算符时。我一直在寻找解决方案,似乎jinja2安全过滤器可以解决这个问题,但是当我将它附加到打印值时,它会使我的所有javascript无效。
以下是代码示例:
function test() {
var nameField=document.getElementById("thing");
nameField.value="{{ values[0] }}";
}
'values'是一个python列表。
如果我可以添加任何内容来澄清问题,请告诉我。
答案 0 :(得分:2)
safe
过滤器实际上会阻止HTML转义,从而为您的问题提供解决方案。
但是你在JavaScript中遇到错误,因为你现在在双引号限制的字符串中有双引号!
假设values[0]
的值是字符串:double-quote " and ampersand
,您会得到:
function test() {
var nameField=document.getElementById("thing");
nameField.value="double-quote " and ampersand"; //trailing and ampersand causing error
}
您可以尝试通过用单引号包装的字符串"{{ values[0] }}"
替换'{{ values[0] }}'
来解决问题。但是,如果你的字符串包含单引号怎么办?
您可能还认为需要转义特殊字符,但是您需要使用java脚本转义(双引号变为%22
)而不是python转义(双引号变为\"
)。
恕我直言,问题的核心在于你使用Jinja打印代码(不是值或标记)。 当您需要动态行为时,为什么在可以拥有提供客户端动态行为的静态代码时更改JavaScript代码?
如果values[0]
已经位于HTML文件的DOM中(在HTML元素的id
中,或在任何其他属性中或option
的{ {1}}输入),让JavaScript去获取它。如果它不在DOM中,请将其放在具有适当select
的隐藏元素中。
id
并在需要时检索它。
这还有一个优点,就是将您的JavaScript代码完全与服务器端页面生成和Jinja分离:您的JavaScript仍然可以在提供正确HTML结构的单一条件下工作。您可以将JavaScript移动到`<div style="diplay:none;" id="value0">{{ value[0] }}</div>`
文件,并将其用于其他项目,以及不使用Flask / Jinja2的项目。