Le classi del modulo sono intese (IMO) per i dati inviati rispetto alle regole. Ad esempio: le password sono uguali, la data di fine è successiva alla data di inizio.
submitted data--->|Form|
Va bene per le classi Modulo convalidare i dati inviati rispetto ai dati recuperati da un database? Questo sembra un problema di responsabilità , la classe Form dovrebbe essere responsabile della convalida e della pulizia della submission da sola e il controllo del DB appartiene al di fuori della classe.
submitted data--->|Form|<---data from DB
Ecco il mio esempio in WTForms in Python: controlla se l'id utente è un numero intero, quindi interroga il DB per verificare che esista.
class ClientForm(Form):
name = StringField(validators=[DataRequired(message="Invalid value")])
user = IntegerField(validators=[DataRequired(message="Invalid value")])
zone = IntegerField(validators=[AnyOf([i[0] for i in ZONES], message="Invalid value")])
#validate user as real
def validate_user(form, field):
user = db.session.query(User).filter(User.id==form.user.data).first()
if not user:
raise ValidationError('Invalid user')
Il vantaggio di aggiungere questo assegno al modulo è conveniente, WTForms gestisce tutti gli aspetti degli errori, anche nel renderli:
form = ClientForm(post_data)
if not form.validate():
# render the form again with errors highlighted
return render("client_registration_form.html", form=form)
else:
return render("success.html")