Je suis un didacticiel Flask de http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982 et je suis actuellement bloqué sur l'étape de validation. :
L'ancienne version avait les caractéristiques suivantes:
from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators, ValidationError
class ContactForm(Form):
name = TextField("Name", [validators.Required("Please enter your name.")])
email = TextField("Email", [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")
En lisant les commentaires, je l'ai mis à jour comme suit: (remplacé validators.Required with InputRequired)
(same fields)
class ContactForm(Form):
name = TextField("Name", validators=[InputRequired('Please enter your name.')])
email = EmailField("Email", validators=[InputRequired("Please enter your email address.")]), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")
Mon seul problème est que je ne sais pas quoi faire avec les validateurs.Email. Le message d'erreur que je reçois est le suivant:
NameError: name 'validators' is not defined
J'ai parcouru la documentation, peut-être que je n'ai pas approfondi suffisamment mais je n'arrive pas à trouver un exemple de validation de courrier électronique.
Essaye ça:
from flask.ext.wtf import Form
from wtforms import validators
from wtforms.fields.html5 import EmailField
class ContactForm(Form):
email = EmailField('Email address', [validators.DataRequired(), validators.Email()])
J'ai suivi le même tutoriel que le recyclage (je n'avais pas regardé la fiole depuis quelques années).
Le problème est dû à une modification de Flask-WTF à la version 0.9. Ici , ils disent:
Remarque: à partir de la version 0.9.0, Flask-WTF n'importera plus rien de Wtforms, vous devez importer des champs à partir de wtforms.
Pour importer directement, forms.py devrait se lire:
from flask.ext.wtf import Form
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import InputRequired, Email
class ContactForm(Form):
name = StringField("Name", [InputRequired("Please enter your name.")])
email = StringField("Email", [InputRequired("Please enter your email address."), Email("This field requires a valid email address")])
subject = StringField("Subject", [InputRequired("Please enter a subject.")])
message = TextAreaField("Message", [InputRequired("Not including a message would be stupid")])
submit = SubmitField("Send")
Notez que StringField
remplace TextField
et que InputRequired
est préféré àDataRequired
. La préférence personnelle était d’importer les validateurs directement par rapport à l’espace de noms entier. Cela fonctionne aussi: from wtforms import *
et dans la classe de formulaire: name = StringField("Name", [validators.InputRequired("message")
Pendant votre mise à jour vers la dernière version de Flask-WTF, vous pouvez également utiliser validate_on_submit()
à votre vue ( comme recommandé ici ).
Et la commodité validate_on_submit vérifiera s’il s’agit d’une demande POST Et si elle est valide.
from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.fields.html5 import EmailField
from wtforms.validators import DataRequired, Email
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = EmailField('Email Address', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Email()])
remember_me = BooleanField('Remember me')
submit = SubmitField('Sign In')
La raison de cette erreur est que vous avez probablement importé les validateurs sans espace de nom, à l’aide des instructions from foo import bar
import.
Pour le rendre un peu plus lisible et pour corriger les erreurs de syntaxe dans votre exemple de code:
from flask.ext.wtf import Form
from wtforms import TextField, SubmitField
from wtforms.validators import InputRequired, Email
from wtforms.fields.html5 import EmailField
class ContactForm(Form):
name = TextField("Name", validators=[InputRequired('Please enter your name.')])
email = EmailField("Email", validators=[InputRequired("Please enter your email address."), Email("Please enter your email address.")])
submit = SubmitField("Send")
Cela ne charge que dans les champs TextField
, SubmitField
et Email
ainsi que seulement les validateurs InputRequired
et Email
. Ensuite, enchaînez simplement les validateurs dans votre argument de mot clé validators
et vous pourrez continuer. Ou, comme @Mehdi Sadeghi l'a souligné dans le code, fournissez directement une liste de validateurs comme deuxième argument du champ, auquel cas votre champ de courrier électronique ressemblerait à ceci:
email = EmailField("Email", [InputRequired("Please enter your email address."), Email("Please enter your email address.")])
Notez qu'en important uniquement ce dont vous avez besoin à l'aide de la syntaxe from foo import bar
, vous jetez l'espace de noms des modules, comme vous l'avez également remarqué lorsque vous avez supprimé le préfixe validators.
. Certains trouvent préférable de quitter cet espace de noms et utilisent donc la notation point, simplement pour éviter les conflits de noms et voir immédiatement à quel module appartient un objet (sans avoir à regarder en arrière les instructions import).
Comme toujours, le choix vous appartient!