WTForms在Jinja2中使用引号

时间:2018-05-21 19:05:59

标签: flask jinja2

我有以下WTForms课程:

from flask_wtf import FlaskForm
from wtforms import SelectField

class MonitorLevel(FlaskForm):
    monitor = SelectField('Monitor', choices=MONITOR_CHOICES)

可以使用以下jinja2代码呈现:

{{ form.monitor() }}

但是,我想在值更改时执行JS脚本,所以我添加了以下内容:

{{ form.monitor(**{'onchange': 'sendForm();'}) }}

哪个工作正常,但现在我想传递一个变量(这是一个字符串)作为参数:

{{ form.monitor(**{'onchange': 'sendForm("{}");'.format(variable)}) }}

然而,这呈现为:

<select id="monitor" name="monitor" onchange="sendForm(&quot;name&quot;);">...</select>

所以,我试图使用safe函数来逃避这一点,但这不起作用。我也试图通过以下方式逃避引用:\“,但这不起作用。

在dict的值中添加引号的任何想法?

提前致谢,

2 个答案:

答案 0 :(得分:0)

此行为是正常的,WTForms使用escape(s, quote=True)呈现HTML属性值(escape documentation

您可以在Github directly更多信息中查看函数def html_params(**kwargs):

基本上,您不必更改代码,因为:

  1. Javascript仍然像魅力一样,您的浏览器动态转换HTML实体(sendForm()运行onchange)。
  2. 如果您在没有onchange="sendForm("name");"的情况下打印,则
  3. escape(s, quote=True)不是有效的HTML属性。

答案 1 :(得分:0)

来自 WTForms 文档 https://wtforms.readthedocs.io/en/2.3.x/widgets/#widget-building-utilities :

<块引用>

WTForms 在呈现之前使用 MarkupSafe 来转义不安全的 HTML 字符。您可以使用 markupsafe.Markup 标记字符串以指示不应对其进行转义。

没有使用 markupsafe.Markup 我也有同样的错误:

{{ input_field(**{'@click': '"show=true"'})|safe }}

给予

<input @click="&#34;show=true&#34;">

代替

<input @click="'show=true'">

在 Jinja2 模板中使用 markupsafe 模块:

{{ input_field(**{'@click': markupsafe.Markup("show=true")})|safe }}

完成工作:

<input @click="show=true">

注意:WTForm 将字符串括在双引号 " 中,因此您需要注意字符串中的 "

不好的方式

{{ input_field(**{'@click': markupsafe.Markup('console.log("show=true")')})|safe }}

会导致

<input @click="console.log("show=true")">

这是错误的(一个字符串不在另一个里面)。

好方法

{{ input_field(**{'@click': markupsafe.Markup("console.log('show=true')")})|safe }}

会给

<input @click="console.log('show=true')"