[英]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的值。
Enum
實例 str(Enum.value)
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.