1

Flaskでフォームベースのアプリケーションを構築していて、オプションの電子メールフィールドで問題が発生しました。Python AppEngine、EmailPropertyを空白にすることはできません

タイプEmailProperty()のデータストアフィールドを設定して空にすることはできますか?エンティティ定義でrequired=Falseを指定しても、フィールドmust not be emptyを示すBadValueErrorが引き続き発生しているようです。 Pythonクライアントの最新バージョンではいくつかの

# my entity definition 
from google.appengine.ext import db 

class Model(db.Model): 
    email = db.EmailProperty(required=False) 

、ライン879の周りgoogle_appengine/google/appengine/api/datastore_types.pyで、Emailクラスの__init__呼び出しは次のようになります。

class Email(unicode): 
    def __init__(self, email): 
     super(Email, self).__init__() 
     ValidateString(email, 'email') 

それは持っていValidateStringにオーバー実行を渡します。何の逆数にセットされます場合、それはいいだろう

def ValidateString(value, 
        name='unused', 
        exception=datastore_errors.BadValueError, 
        max_len=_MAX_STRING_LENGTH, 
        empty_ok=False): 

:どのFalseデフォルトブール・パラメータをempty_ok私のEmailPropertyフィールドのrequired= paramに設定されています。たとえば、私のエンティティ定義ではrequired=Falseがあるので、​​を呼び出すときにこの電子メールクラスがTrueempty_okパラメータに渡すことができればいいと思います。しかし、そうではないので、私は本当に良い回避策を理解したいと思います。

オプションのメールアドレスフィールドを保存しようとしている唯一の開発者はいませんか?私のフォームでデータが渡された場合は、組み込みの検証を実行したいので、助けてもStringPropertyに変更したくないのですが...

+0

残念ながらEmailPropertyは空白の値を許可されたことはありません。これは、私が多くの状況でこれらのタイプのプロパティを使用して放棄した理由の1つです。 ndbにはEmailPropertyが含まれていないことに注意してください。レガシーコードを持っていない限り、あなたは本当にdbを使いたいのですか? –

+0

ありがとう、@ティムホフマン。それは「レガシーコード」よりも「レガシーな作業知識」です。私はdbにndbよりよく慣れています.dbがすぐに廃止されることがないなら、数千行のコードの後に​​スイッチを入れるためにパフォーマンスの向上は必要ありません。 :) – iandouglas

+0

個人的に私はEmailPropertyを使用せず、顧客バリデーターでStringPropertyを使用することを推奨します。 –

答えて

1

N.B.:dbモジュールは、これまでずっとndbモジュールに取って代わられてきました。 dbは何年も重要な更新を受けていません。可能であれば更新することをお勧めしますが、ここを回避するにはいくつかのアイデアがあります。

あなたが確認したように、Emailクラスは空の値を許可しません。おそらく、ここで一番簡単な方法は、ちょうどEmailPropertyの代わりに使用する独自の型クラスとプロパティクラスを定義している:

from google.appengine.ext import db 


    class EmailOrNone(datastore_types.Email): 
     def __init__(self, email): 
      super(EmailOrNone, self).__init__(email) 
      ValidateString(email, 'email', empty_ok=True) 


    class EmailOrNoneProperty(db.EmailProperty): 
     data_type = EmailOrNone 

それからちょうどEmailPropertyの代わりに新しいEmailOrNonePropertyを使用しています。

StringPropertyにはcustom validatorを使用することもできます。

免責事項:私はこのコードをテストしていませんが、そのアイデアは健全です。

+0

私は非常に微妙な調整を行ったきれいなwtforms_appengineライブラリを使用しています。これは、私のappengineモデルを直接wtformフォームに変換し、HTML5入力タイプとしてレンダリングできるようにしています(モバイル初のデザインとスクリーンキーボードに便利です。電話番号のみを入力している場合など、さまざまな種類に自動調整できます)。彼らはライブラリでもndbサポートを持っていますが、html5フィールドタイプを強制するために余分なコードを書く必要があります。私は主要なリファクタリングを避けることを望んでいたので、私はあなたの考えを試してみましょう。 Twitterでのお返事ありがとうございました! – iandouglas

0

if電子メールが提供されましたか?

class Email(unicode): 
    def __init__(self, email): 
     super(Email, self).__init__() 
     if email != "": 
      ValidateString(email, 'email') 

ユーザーがFalseとして評価され、空でない「電子メール」を提供する場合、それは文字列の検証をスキップしてはなりませんように、私は故意にif email != ""ではなく、多くのニシキヘビif emailのために行ってきたノート。

関連する問題