【问题标题】:Flask WTForms Custom Validator Not WorkingFlask WTForms 自定义验证器不工作
【发布时间】:2020-02-12 22:22:47
【问题描述】:

此自定义验证器应检查 2 个数据库,以查看表单中输入的值是否与名为 training_name 和 date 的列中的值相同。但是,如果我输入数据库中存在的重复记录,则不会引发错误。请指教

class add_training_form(FlaskForm): #All fields are required
    training_course = SelectField('Training Course', choices=[], validators=[DataRequired()]) #The choices will be assigned in route
    training_provider = SelectField('Training Provider', choices=[], validators=[DataRequired()])
    date = DateField('Date of Training', validators=[DataRequired()])
    cpd = IntegerField('CPD hours',validators=[DataRequired(message='Invalid input')] )
    certificate = FileField('Certificate', validators=[FileRequired(),FileAllowed(['jpg','png','pdf'])])#For certificate

    submit = SubmitField('Submit')

    def validate_duplicate(self, training_course, date):
        training = Training.query.filter_by(training_name=training_course.data,date=date.data).first()
        mv = ManagerVerification.query.filter_by(training_name=training_course.data,date=date.data).first()
        if training or mv:
            raise ValidationError('This is a duplicate training record')

【问题讨论】:

    标签: flask flask-sqlalchemy flask-wtforms wtforms


    【解决方案1】:

    在 Wtforms 文档中,如果你想创建一个自定义验证器,你需要在 FlaskForm 类中创建一个当前名称为 'validate_ + {your field name}' 的函数,FlaskWtf 将传递整个表单和字段,我认为这是代码将为您工作

    class add_training_form(FlaskForm): #All fields are required
        training_course = SelectField('Training Course', choices=[], validators=[DataRequired()]) #The choices will be assigned in route
        training_provider = SelectField('Training Provider', choices=[], validators=[DataRequired()])
        date = DateField('Date of Training', validators=[DataRequired()])
        cpd = IntegerField('CPD hours',validators=[DataRequired(message='Invalid input')] )
        certificate = FileField('Certificate', validators=[FileRequired(),FileAllowed(['jpg','png','pdf'])])#For certificate
    
        submit = SubmitField('Submit')
    
        def validate_training_course(form, training_course):
            training = Training.query.filter_by(training_name=training_course.data,date=form.date.data).first()
            mv = ManagerVerification.query.filter_by(training_name=training_course.data,date=form.date.data).first()
            if training or mv:
                raise ValidationError('This is a duplicate training record')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2018-10-23
      • 2011-09-04
      • 1970-01-01
      • 2012-04-20
      • 2016-08-05
      • 2021-10-13
      相关资源
      最近更新 更多