2017-04-01 6 views
1

私のPython Flaskアプリケーションは、ビルドされたPython EnumサポートでWTFormsを使用しています。 SelectFieldにEnumのすべての値が入力されるフォーム(POST)を送信しようとしています。Python Flask WTForm SelectField Enumの値が有効な選択肢ではありません

「送信」を押すと、「有効な選択ではありません」というエラーが表示されます。これは、入力フォームの値をチェックするとき、フォームには、提供されたEnum値のリストから有効な選択肢が含まれているように見えるので、これは奇妙に思えます。

私はそうのようにフォーマットされAJBEnumという名前のEnumのサブクラスを使用しています:

class UserRole(AJBEnum): 
    admin = 0 
    recipient = 1 

私はプロジェクトを通じて多くの列挙型を使用しているため、これを行うことを選んだと、すべての収集ヘルパー関数を書きたかったです選択と書式WTForm SelectFieldタプルフレンドリー。 AJBEnumはそうのようにフォーマットされています。私はそうのようなSelectFieldの作成時にWTFormsにUserRoleのためのすべての選択肢を与えることができることを意味

class AJBEnum(Enum): 

    @classmethod 
    def choices(cls, blank=True): 
     choices = [] 
     if blank == True: 
      choices += [("", "")] 
     choices += [(choice, choice.desc()) for choice in cls] 
     return choices 

role = SelectField('Role', choices=UserRole.choices(blank=False), default=UserRole.recipient) 

注意を関数パラメータblankは空白の追加を提供しますSelectFieldがオプションの場合は、SelectFieldオプションを使用します。この場合、そうではありません。私は送信ボタンを押すと

は、私は私のルートで入ってくる着信要求をチェックし、form.dataを印刷することで、私は、このコンテンツを与えている:あなたが見ることができるように

{'email': '[email protected]', 'password': 'fake', 'plan': 'A', 'confirm': 'fake', 'submit': True, 'id': None, 'role': 'UserRole.recipient'} 

は、それがのUserRoleを文字列化たWTFormsを表示されます。受信者。受信したPOST要求値を意図したEnum値に変換することにWTFormsを強制する方法はありますか?

答えて

2

WTForms

あなたが実際にcoerceと呼ばれて探している引数を強制する方法はあります、そしてそれは選択肢の値にフィールドの文字列表現に変換呼び出し可能に受け入れます。

  1. 選択値が
  2. Enumインスタンスである必要があり、フィールド値は、フィールドのテキストが、私はいくつかとEnumを拡張しました、これを実現するためにEnum.name

でなければなりませんstr(Enum.value)

  • する必要がありますWTFormsヘルパー:

    class FormEnum(Enum): 
        @classmethod 
        def choices(cls): 
         return [(choice, choice.name) for choice in cls] 
    
        @classmethod 
        def coerce(cls, item): 
         return cls(int(item)) if not isinstance(item, cls) else item 
    
        def __str__(self): 
         return str(self.value) 
    

    次に、SelectFieldを使用してFormEnum派生値を編集できます。

    role = SelectField(
         "Role", 
         choices = UserRole.choices(), 
         coerce = UserRole.coerce) 
    
  • 関連する問題