【问题标题】:WTForm "OR" conditional validator? (Either email or phone)WTForm“或”条件验证器? (电子邮件或电话)
【发布时间】:2016-07-20 16:58:31
【问题描述】:
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() 方法并检查是否存在。

标签: python flask wtforms flask-wtforms


【解决方案1】:

谢谢@reptilicus。我对答案进行了细微的更改以使其正常工作。

  1. 必须检查数据字段self.email.data and self.phone.data
  2. 还必须在 validate() 方法结束时返回 valid 而不是 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

【讨论】:

    【解决方案2】:

    您可以在表单上创建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
    

    【讨论】:

    • 那行得通。我注意到当其他字段失败时,不会触发第二个 if 子句。有没有办法在 Form.validate 期间触发对 self.email.data 或 self.phone.data 的检查?
    • 稍微修改了一下,看看是否可行。如果是这样,请接受答案,以便未来的读者受益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多