簡體   English   中英

驗證時,Python Flask WTForm SelectField的枚舉值為“無效選項”

[英]Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation

我的Python Flask應用程序使用內置python Enum支持的WTForms。 我正在嘗試提交一個表單(POST),其中SelectField由Enum的所有值填充。

當我點擊“提交”時,我收到錯誤,“不是一個有效的選擇。” 這看起來很奇怪,因為在檢查傳入表單的值時,表單看起來確實包含了所提供的Enum值列表中的有效選項。

我正在使用名為AJBEnum的Enum的子類,其格式如下:

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

我之所以選擇這樣做,是因為我在項目中使用了很多枚舉,想要編寫一個幫助函數來收集所有選項並將它們格式化為WTForm SelectField元組友好。 AJBEnum的格式如下:

class AJBEnum(Enum):

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

這意味着我可以在創建SelectField期間為WTForms提供UserRole所有選擇,如下所示:

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

請注意 ,如果SelectField是可選的,則函數參數blank提供額外的空白SelectField選項。 在這種情況下,它不是。

當我點擊提交按鈕時,我檢查我的路由中的傳入請求,並打印form.data我給出了以下內容:

{'email': 'abc@gmail.com', 'password': 'fake', 'plan': 'A', 'confirm': 'fake', 'submit': True, 'id': None, 'role': 'UserRole.recipient'}

正如您所看到的,WTForms似乎已經對UserRole.recipient進行了字符串化。 有沒有辦法強制WTForms將傳入的POST請求值轉換回原來的Enum值?

有沒有辦法強迫WTForms

您正在尋找的參數實際上稱為coerce ,它接受一個callable,它將字段的字符串表示形式轉換為choice的值。

  1. 選擇值應為Enum實例
  2. 字段值應為str(Enum.value)
  3. 字段文本應為Enum.name

為了實現這一點,我用一些WTForms助手擴展了Enum

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM