Reputation: 502
This custom validators should check 2 databases to see if the values entered in the form are equal to those in the columns called training_name and date. However, no errors are being raised if I enter duplicate records that exist in the database. Please advise
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')
Upvotes: 1
Views: 2126
Reputation: 714
In Wtforms doc is write if you wanna make a custom validator you need to create a function inside FlaskForm class with current name 'validate_ + {your field name}' and FlaskWtf will pass the entire form and the field, i think this code will work for you
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')
Upvotes: 1