0

第一篇文章;我会尽量保持简短和甜蜜。

我正在尝试呈现一个编辑表单,如果这些字段的值已经存在,它会检测并填充输入字段。我正在使用带有 jinja2 的烧瓶,当我使用{{ }}打印运算符时,我的字段将它们的双引号和 & 符号分别呈现为"&

问题:只有在 javascript 函数中使用 print 运算符时才会发生这种情况。我到处寻找解决方案,似乎 jinja2 安全过滤器可以解决问题,但是当我将它附加到打印值时,它使我的所有 javascript 都无效。

下面是一个代码示例:

function test() {
    var nameField=document.getElementById("thing");
    nameField.value="{{ values[0] }}";
}

'values' 是一个 python 列表。

如果我可以添加任何内容来澄清问题,请告诉我。

4

1 回答 1

3

过滤器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 中(在idHTML 元素中,或在任何其他属性或在输入的 HTML 中optionselect,让 JavaScript 去获取它。如果它不在 DOM 中,请将其放在一个隐藏元素中,并带有适当的ideg

`<div style="diplay:none;" id="value0">{{ value[0] }}</div>`  

并在需要时检索它。

这还具有将您的 JavaScript 代码与服务器端页面生成和 Jinja 完全分离的优点:您的 JavaScript 在提供正确 HTML 结构的单一条件下仍然可以工作。您可以将 JavaScript 移动到.js文件中,并将其用于其他项目,以及不使用 Flask/Jinja2 的项目。

于 2013-08-08T11:02:02.723 回答