Help us understand the problem. What is going on with this article?

WTFormsでAnyOfバリデーションがSelectMultipleFieldのとき常にエラーを返す

TL; DR

AnyOfバリデーションがSelectMultipleFieldに対応していないため。
カスタムバリデーションを用いる必要がある。

詳細

AnyOfバリデーションの実装をみると、SelectMultipleFieldに対応していません。
SelectMultipleFieldの場合、field.dataがlist型で渡ってくるので562行目が常にTrueを返してしまいます。

https://github.com/wtforms/wtforms/blob/23f730a9cfca478f01fda2b38fde17ad56e9a83d/src/wtforms/validators.py#L562

解決策

こんな感じでSelectMultipleField用のバリデーションを作成してあげれば良いです。

def anyof_for_multiple_field(values):
  message = 'Invalid value, must be one of: {0}.'.format( ','.join(values) )

  def _validate(form, field):
    error = False
    for value in field.data:
      if value not in values:
        error = True

    if error:
      raise ValidationError(message)

  return _validate
hayashi-ay
海なし県出身のペンジニア。
https://menta.work/plan/1082
codmon
保育園・幼稚園向け業務支援システム「コドモン」の開発・運営を手がける会社です。
https://www.wantedly.com/companies/codmon
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away