我可以将 wtforms DateTimeField 设置为也只接受日期值吗?

can I set a wtforms DateTimeField to also accept just a Date value?

我想让我的应用程序的用户输入日期或日期时间。有什么办法可以用一个字段实现这个吗?

dateCreated = DateField('Date created', validators[Required(message='Input must be of YYYY-MM-DD format.')])

sessionDate = DateTimeField('Date', validators=[Required(message='Input must be of YYYY-MM-DD HH:MM:SS format.')])

接受一个或另一个。有什么办法可以让一个字段接受其中任何一个?

这可以通过创建一个新的字段子类来完成,它将接受任何一种日期格式和 returns a datetime.datetime(但可以很容易地修改为 return a datetime.date).

此实现基于 wtforms.fields.DateTimeField (source)

class LenientDateTimeField(Field):

    def __init__(self, label=None, validators=None, formats=None, **kwargs):
        super(LenientDateTimeField, self).__init__(label, validators, **kwargs)
        if formats is None:
            self.formats = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d']
        else:
            self.formats = formats
        self.format = None

    def _value(self):
        if self.raw_data:
            return ' '.join(self.raw_data)
        else:
            return self.data and self.data.strftime(self.format) or ''

    def process_formdata(self, valuelist):
        if valuelist:
            date_str = ' '.join(valuelist)
            for fmt in self.formats:
                try:
                    self.data = datetime.datetime.strptime(date_str, fmt)
                    # If a datetime.date is required, do:
                    # datetime.datetime.strptime(date_str, fmt).date() 
                    self.format = format
                except ValueError:
                    self.data = None
                else:
                    break
            if self.data is None:
                message = 'Value did not match any of these formats: {}'.format(', '.join(self.formats))
                raise ValueError(self.gettext(message))