在 Python Flask WTForms 中,如何创建对另一个字段的依赖

In Python Flask WTForms, how to create a dependency over another field

我有一个 source 字段:

source = SelectField("Source", choices=[
                   ('option1', 'option1'),
                   ('option2', 'option2'),
                   ('option3', 'option3'),
               validators=[InputRequired()])

然后是一个 uri 字段,它需要基于上述内容的不同正则表达式:

uri = StringField('URI', Regexp(regex=r'regex1'))

例如。如果选择 option1,则正则表达式将为 regex1,如果选择 option2,则为 regex2,依此类推。

用 WTForms 实现它的正确方法是什么?

WTForms 中不存在此功能。您必须自己使用工具。这很快就会变得很重要,具体取决于您的具体应用 logic/needs。

一种方法是让客户端 JS 向动态生成新表单的视图发送请求,并根据输入添加表单的后续部分。例如,您的字段可以有一个 onChangeonBlur 函数,该函数将输入发送到一个视图,该视图 returns 添加了下一组字段的新表单。

解决此问题的另一种方法是使用一些巧妙的表单呈现,CSS 和 JS。例如,表单将呈现所有可能的字段,但这些字段将根据之前通过 JS/CSS 所做的选择有条件地隐藏和显示。这种方法的一个问题是验证变得复杂。

关于如何使用 Django Forms 而不是 WTForms,有一些 writeups。不过,相同的概念应该很容易适用于 WTForms。

相关文档:dynamic form composition.