如何禁用wtforms SelectField选项验证?

sho*_*ujs 7 python flask wtforms

我有一个wtforms表单

class MyForm(Form):
    names = SelectField('name', choices=[])
Run Code Online (Sandbox Code Playgroud)

名称字段的选择是动态构建的,并通过ajax调用在模板中呈现.当我提交表单时,它会引发异常"不是一个有效的选择".我不希望表单为我验证名称字段的选择.如何禁用验证?

Xea*_*lot 9

我做了类似的事情来绕过SelectMultipleFieldWTForms中的验证.它应该以平原的方式工作SelectField

class NonValidatingSelectMultipleField(SelectMultipleField):
    """
    Attempt to make an open ended select multiple field that can accept dynamic
    choices added by the browser.
    """
    def pre_validate(self, form):
        pass
Run Code Online (Sandbox Code Playgroud)

我只是覆盖了内置验证.


Sha*_*anu 8

我遇到了同样的问题。Xealot提供的解决方案很棒。我发现有一个选项可以将验证设置为False使用validate_choice=False. 我在下面提供了两个解决方案的示例。

class NonValidatingSelectField(SelectField):
    """
    Attempt to make an open ended select multiple field that can accept dynamic
    choices added by the browser.
    """
    def pre_validate(self, form):
        pass

class MyForm(Form):
    names = NonValidatingSelectField('name')
    names2 = SelectField('name2', validate_choice=False)
Run Code Online (Sandbox Code Playgroud)


Eev*_*vee 0

通过“我不希望表单验证选择”,我认为您实际上的意思是“我稍后会自己做,并怀疑表单是否有能力正确完成它”。

但你很幸运!您可以对现有表单进行子类化以动态添加选项。

class MyForm(Form):
    # other fields...


def some_handler(request):
    name_choices = build_name_choices()
    class RealForm(MyForm):
        names = SelectField('name', choices=name_choices)

    form = RealForm(request.GET)
    form.validate()
Run Code Online (Sandbox Code Playgroud)

这也使您免于将表单的验证和错误消息与您稍后生成的消息合并的繁琐工作。

  • 您只是用自己的问题替换了作者的问题并回答了它。我也有这个需求,但这仍然是错误的假设。我的需要是在客户端上动态添加开放的选择,因此在服务器上是未知的。 (5认同)