使用小部件时如何更新表单值

问题描述 投票:0回答:1

我正在构建一个非常简单的颜色输入表单,并使用内置的 wtforms 小部件。这仅显示颜色选择器并且不允许文本输入,但希望让用户能够执行任一操作。所以我创建了另一个仅包含文本值的字段。

当其他更改输入时,如何更新我的 color/color1 字段?无论如何,我看不到将“事件”附加到表单条目。我对 Python/Flask/WTForms/Jinja 很陌生,所以解决方案可能很明显,但我无法解决!

这是我的简单形式类

class UserInput(FlaskForm):
  color = StringField('color', default="#00ff00")
  color1 = StringField('color1', widget=widgets.ColorInput(), default='#00ff00')
  submit = SubmitField('Go')

这是我的html代码

<form action="" method="post">
     <p>
      {{form.color1.label}} <br>
      {{form.color}} {{form.color1}}
     </p>
     <p>
      {{form.submit()}}
     </p>
   </form>
flask jinja2 flask-wtforms wtforms
1个回答
0
投票

由于 jinja 是在服务器端呈现的,因此您无法立即对用户输入做出反应,因此一个输入字段会更新另一个输入字段。为了实现这一点,您需要在客户端执行 JavaScript。

以下示例在两个输入字段中注册

change
事件的侦听器。如果用户更改一个字段的值,另一字段的值会自动更新。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Index</title>
</head>
<body>
    <form action="" method="post">
        {{ form.csrf_token }}
        <div>
            {{form.color1.label}}
            {{form.color}} {{form.color1}}
        </div>
        <div>
            {{form.submit()}}
        </div>
     </form>

     <script>
        (function() {
            const elems = ['color1', 'color'].map((id) => document.getElementById(id));
            elems.forEach(elem => {
                elem.addEventListener('change', (event) => {
                    const value = event.target.value;
                    elems.forEach(el => el.value = value);
                });
            });
        })();
     </script>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.