WTForm "OR" 条件验证器? (电子邮件或 phone)

WTForm "OR" conditional validator? (Either email or phone)

class ContactForm(Form):
  name = StringField('Name',
                     validators=[DataRequired(), Length(max=255)])
  email = StringField('Email',
                      validators=[Optional(), Email(), Length(max=255)])
  phone = StringField('Phone number',
                      validators=[Optional(), NumberRange(min=8, max=14)])
  comment = TextAreaField(u'Comment',
                          validators=[DataRequired()])

是否可以指定一个验证器,以便 emailphone 是必需的?

您可以在表单上创建一个 validate 方法并进行一些手动检查。这样的事情可能会让你开始。

class MyForm(Form):
    name = StringField('Name',
                 validators=[DataRequired(), Length(max=255)])
    email = StringField('Email',
                      validators=[Optional(), Email(), Length(max=255)])
    phone = StringField('Phone number',
                      validators=[Optional(), NumberRange(min=8, max=14)])
    comment = TextAreaField(u'Comment',
                          validators=[DataRequired()])
    def validate(self):
        valid = True
        if not Form.validate(self):
            valid = False
        if not self.email and not self.phone:
            self.email.errors.append("Email or phone required")
            valid = False
        else:
            return valid

谢谢@reptilicus。我对它的答案进行了一些小改动。

  1. 必须检查数据字段 self.email.data and self.phone.data
  2. 还必须 return 在 validate() 方法结束时有效而不是 else 条件。
def validate(self):
    valid = True
    if not Form.validate(self):
        valid = False
    if not self.email and not self.phone:
        self.email.errors.append("Email or phone required")
        valid = False
    return valid