在调用DateField的验证器之前如何修改field.data?

3 投票
2 回答
1959 浏览
提问于 2025-04-17 13:45

我的问题很简单,这里有一个基本的例子:

class F(Form):
  date_test = DateField('Test', validators=[Required()], format='%d/%m/%Y')

我需要在验证器被调用之前,修改用户发送的值。有什么简单的方法可以做到这一点,同时又不失去使用WTForms的好处呢?

2 个回答

2

所有的WTForm字段都应该支持一个叫做 filters 的参数,这个参数是一个可调用对象的列表,会对输入的数据进行处理:

def transform_data(data):
    # do something with data here
    return data

class F(Form):
    date_test = DateField('Test', validators=[Required()], format='%d/%m/%Y',
                              filters=[transform_data])
2

其实“过滤器”挺不错的,但并不是我想要的效果。于是我创建了一个自定义字段,现在它可以正常工作了。

class MyDateField(DateField):
    def __init__(self, label='', validators=None, transform_data=False, **kwargs):
        super(MyDateField, self).__init__(label, validators, **kwargs)
        self.transform_data = transform_data

    def process_formdata(self, valuelist):
      if self.transform_data:
        data = str(valuelist[0])
        # transform your data here. (for example: data = data.replace('-', '.'))

      super(MyDateField, self).process_formdata([data])

class F(Form):
    date_test = MyDateField('Test', validators=[Required()], format='%d/%m/%Y', transform_data=True])

如果你想直接修改用户字段里的值,你需要重写 _value() 这个方法。

撰写回答