2016-03-03 150 views
1

我想获取用户输入日期的数据,或者输入任何内容的当前日期。我使用WTForms创建一个包含日期输入的表单,如果日期字段有数据,则覆盖validate以返回True。但是,即使我输入日期,该表格也始终无效。为什么这不起作用?使用自定义验证方法的WTForms表单从来没有生效

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) 

回答

2

您不是正确覆盖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)