【问题标题】:Field validations to compare two date fields in Flask-WTForms字段验证以比较 Flask-WTForms 中的两个日期字段
【发布时间】:2020-11-22 09:36:43
【问题描述】:

我有两个表单域:start_date 和 finish_date。现在我想检查finish_date 是否大于或等于start_date。如何实现?

class AddChallenge(FlaskForm):
    title = StringField('Title', validators=[DataRequired()])
    start_date = DateField('Start Date',
                           validators=[DataRequired(),
                                       DateRange(min=date.today())],
                           format='%Y-%m-%d', default=date.today)
    finish_date = DateField('Finish Date',
                            validators=[DataRequired(),
                                        DateRange(min=date.today())],
                            format='%Y-%m-%d', default=date.today)
    submit = SubmitField("Create")

【问题讨论】:

    标签: flask flask-wtforms


    【解决方案1】:
    class AddChallenge(FlaskForm):
        title = StringField('Title', validators=[DataRequired()])
        start_date = DateField('Start Date',
                               validators=[DataRequired()],
                               format='%Y-%m-%d', default=date.today)
        finish_date = DateField('Finish Date',
                                validators=[DataRequired()
                                            ],
                                format='%Y-%m-%d', default=date.today)
        submit = SubmitField("Create")
    
        def validate_finish_date(self, filed):
            if filed.data <= self.start_date.data:
                raise ValidationError('Finish date must more or equal start date.')
    

    您可以使用此类命名规则来自定义验证规则。比如这个validate_yourfiledname。

    【讨论】:

      【解决方案2】:

      刚遇到同样的问题,发现this post 内置的validate() 功能得到了增强。它解决了我的问题,与接受的答案基本相同。为了完整起见,在您的情况下:

      class AddChallenge(FlaskForm):
          title = StringField('Title', validators=[DataRequired()])
          start_date = DateField('Start Date',
                                 validators=[DataRequired()],
                                 format='%Y-%m-%d', default=date.today)
          finish_date = DateField('Finish Date',
                                  validators=[DataRequired()
                                              ],
                                  format='%Y-%m-%d', default=date.today)
          submit = SubmitField("Create")
      
          # Custom validation function (redefine built-in)
          def validate(self, **kwargs):
              # Standard validators
              rv = FlaskForm.validate(self)
              # Ensure all standard validators are met
              if rv:
                  # Ensure end date >= start date
                  if self.start_date.data > self.finish_date.data:
                      self.finish_date.errors.append('Finish date must be set after the starting date.')
                      return False
      
                  return True
      
              return False
      

      【讨论】:

        猜你喜欢
        • 2018-02-24
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-08
        • 2015-04-19
        • 2010-11-06
        • 1970-01-01
        • 2017-03-07
        相关资源
        最近更新 更多