【问题标题】:How can I disable the wtforms SelectField choices validation?如何禁用 wtforms SelectField 选项验证?
【发布时间】:2013-01-04 04:20:38
【问题描述】:

我有一个 wtforms 表单

class MyForm(Form):
    names = SelectField('name', choices=[])

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

【问题讨论】:

  • 那为什么要添加choices参数呢?为什么不names = SelectField('name')

标签: python flask wtforms


【解决方案1】:

我做了这样的事情来绕过 WTForms 中的 SelectMultipleField 验证。它应该与普通的 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

我只是覆盖了内置验证。

【讨论】:

  • 这完全正确。如果有人感兴趣,这里是您要跳过的 pre_validate 代码:
  • 那是普通的 SelectField。这是 SelectMultipleFIeld: def pre_validate(self, form): if self.data: values = list(c[0] for c in self.choices) for d in self.data: if d not in values: raise ValueError(self .gettext("'%(value)s' 不是该字段的有效选择") % dict(value=d))
【解决方案2】:

我遇到了同样的问题。 Xealot 提供的解决方案很棒。我发现有一个选项可以使用validate_choice=False 将验证设置为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)

【讨论】:

  • 对于任何在这个线程上绊倒并面临同样问题的人,设置 validate_choice=False 是在 2.x+ 版本中采用的正确解决方案
  • 我的版本为 2.2.1,但 validate_choice 尚未实现。分享以防其他人头疼
【解决方案3】:

“我不希望表单验证选择”,我假设您实际上的意思是“我稍后会自己做,但怀疑表单是否有能力正确执行” .

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

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()

这也使您免于将表单的验证和错误消息与您以后自己生成的消息合并的乏味。

【讨论】:

  • 您只是将作者的问题替换为您自己的问题并回答了。我也有这个需求,这仍然是错误的假设。我的需要是在客户端动态添加开放选择,因此在服务器上是未知的。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2019-10-02
  • 2018-04-05
  • 2017-05-16
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多