【问题标题】:WTForms form with custom validate method is never valid具有自定义验证方法的 WTForms 表单永远无效
【发布时间】:2016-06-17 03:13:43
【问题描述】:

我想获取用户输入日期的数据,如果未输入任何内容,则为当前日期。我使用 WTForms 创建了一个带有日期输入的表单,如果日期字段有数据,则覆盖 validate 以返回 True。但是,即使我输入日期,表格也始终无效。为什么这不起作用?

class ChooseDate(Form):
    date = DateField(format='%m-%d-%Y')

    def validate(self):
        if self.date.data is None:
            return False
        else:
            return True

@app.route('/index', methods=['GET', 'POST'])
def index():
    date_option = ChooseDate()
    print(date_option.date.data)  # always None

    if date_option.validate():
        request_date = date_option.date.data
    else:
        request_date = datetime.today().date()

    return render_template_string(template_string, form=date_option, date=request_date)

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    您没有正确覆盖validatevalidate 触发表单读取数据并填充字段的data 属性。你没有打电话给super,所以这永远不会发生。

    def validate(self):
        res = super(ChooseDate, self).validate()
        # do other validation, return final res
    

    在这种情况下,没有理由覆盖validate,您只是想确保为该字段输入数据,因此请使用内置的InputRequired 验证器。使用字段验证器也会向表单添加错误消息。

    from wtforms.validators import InputRequired
    
    date = DateField(validators=[InputRequired()])
    

    有关validation 的更多信息,请参阅文档。

    最后,您需要将表单数据传递给表单。如果您使用的是Flask-WTF 扩展的FlaskForm,则会自动传递。

    from flask import request
    
    form = ChooseDate(request.form)
    

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多