WTForms - 创建包含两个或不包含验证但不只是一个字段的字段的表单

时间:2017-03-05 21:12:57

标签: python flask wtforms flask-wtforms

我希望此表单验证两个输入中是否存在日期属性,或者根本没有日期输入,但是只输入任何一个输入时都不会。

因此,如果你有一个开始日期,你必须有一个结束日期,反之亦然,但你不能只单独设置开始或结束日期。

我的代码如下:

class MyForm(Form):
start = DateTimeField(u'Start', format='%Y-%m-%d')
end_date = DateTimeField(u'End', format='%Y-%m-%d')

因此,它验证是否:

  • 未输入任何字段
  • 输入两个字段

不应验证是否:

  • 仅输入任一字段

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果您对使用其他形式的约束不感兴趣,可以在线覆盖验证功能。更多:http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators

class MyForm(Form):
    start = DateTimeField(u'Start', format='%Y-%m-%d')
    end_date = DateTimeField(u'End', format='%Y-%m-%d')

    def validate(self):
        if not Form.validate(self):
            return False

        a = self.start.field.data
        b = self.end_date.field.data
        if (a and b) or not (a or b):
            return True
        else:
            self.start.field.errors.append('Both or none dates must exist.')
            return False

答案 1 :(得分:0)

我最终解决了这个问题:

在类定义之外创建了一个名为validator的函数:

def validator(form, field):
    a = self.start.field.data
    b = self.end_date.field.data
    if not ((a and b) or not (a or b)):
        raise ValidationError('Both or none dates must exist.')

并修改了这样的类:

class MyForm(Form):
    start = DateTimeField(u'Start', [validators.Optional(), validator], format='%Y-%m-%d')
    date_end = DateTimeField(u'End', [validators.Optional(), validator], format='%Y-%m-%d')

需要添加可选的验证器,因为默认情况下WTForm会使DateTimeField成为必填字段