Flaskのチュートリアル http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net- 28982 であり、現在検証ステップで立ち往生しています:
古いバージョンには次のものが含まれていました。
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")
コメントを読んでこれを次のように更新しました:(validators.Requiredを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")
私の唯一の問題は、validators.Emailをどうするかわからないことです。私が得るエラーメッセージは:
NameError: name 'validators' is not defined
ドキュメントを確認しましたが、十分に詳しく調べていない可能性がありますが、メール検証の例を見つけることができません。
これを試して:
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()])
復習と同じチュートリアルを行いました(flaskを数年間見ていない)。
問題は、バージョン0.9でのFlask-WTFの変更によるものです。 ここ 、彼らは言う:
注:バージョン0.9.0以降、Flask-WTFはwtformsから何もインポートしません。wtformsからフィールドをインポートする必要があります。
直接インポートするには、forms.pyは次のようになります。
_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")
_
StringField
はTextField
を置き換え、InputRequired
優先されるDataRequired
であることに注意してください。名前空間全体をインポートするよりも、バリデーターを直接インポートする方が個人的な好みでした。これも機能します:_from wtforms import *
_およびフォームクラス:name = StringField("Name", [validators.InputRequired("message")
Flask-WTFの最新バージョンへの更新中に、ビューでvalidate_on_submit()
を使用することもできます( ここで推奨 )。
そして、便利なvalidate_on_submitは、それがPOSTリクエストであるかどうか、およびそれが有効であるかどうかをチェックします。
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')
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Email
class ContactForm(FlaskForm):
name = StringField("Name", validators=[DataRequired()])
email = StringField("Email", validators=[DataRequired(), Email()])
submit = SubmitField("Send")
このエラーの理由は、from foo import bar
importステートメントを使用して、名前空間なしでバリデーターをインポートした可能性が高いためです。
それをもう少し読みやすくし、コード例の構文エラーを修正するには:
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")
これは、フィールドTextField
、SubmitField
、Email
、およびInputRequired
とEmail
のバリデーターのみをロードします。次に、validators
キーワード引数でバリデーターをチェーンするだけでよいのです。または、@ Mehdi Sadeghiがコードで指摘したように、フィールドの2番目の引数としてバリデーターのリストを直接指定します。この場合、メールフィールドは次のようになります。
email = EmailField("Email", [InputRequired("Please enter your email address."), Email("Please enter your email address.")])
from foo import bar
接頭辞を削除したときにも気づいたように、validators.
という構文を使用して必要なものだけをインポートすると、モジュールの名前空間が破棄されることに注意してください。一部のユーザーは、この名前空間を残してドット表記を使用する方がよいと考えています。名前の衝突を防ぎ、オブジェクトがどのモジュールに属しているかをすぐに確認するためです(インポートステートメントを確認する必要はありません)。
いつものように、選択はあなた次第です!