我有以下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("name");">...</select>
所以,我试图使用safe
函数来逃避这一点,但这不起作用。我也试图通过以下方式逃避引用:\“,但这不起作用。
在dict的值中添加引号的任何想法?
提前致谢,
答案 0 :(得分:0)
此行为是正常的,WTForms使用escape(s, quote=True)
呈现HTML属性值(escape documentation)
您可以在Github directly更多信息中查看函数def html_params(**kwargs):
。
基本上,您不必更改代码,因为:
sendForm()
运行onchange
)。onchange="sendForm("name");"
的情况下打印,则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=""show=true"">
代替
<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')"