ach*_*chi 2 python enums flask wtforms
我的 Python Flask 应用程序使用 WTForms 和内置的 Python Enum 支持。我正在尝试提交一个表单 (POST),其中 SelectField 由枚举的所有值填充。
当我点击“提交”时,出现错误“不是有效的选择”。这看起来很奇怪,因为在检查传入表单的值时,该表单似乎确实包含提供的 Enum 值列表中的有效选择。
我正在使用名为 Enum 的子类,AJBEnum其格式如下:
class UserRole(AJBEnum):
admin = 0
recipient = 1
Run Code Online (Sandbox Code Playgroud)
我选择这样做是因为我在整个项目中使用了许多枚举,并希望编写一个帮助函数来收集所有选择并将它们格式化为 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
Run Code Online (Sandbox Code Playgroud)
这意味着我可以UserRole在创建 SelectField 期间为 WTForms 提供所有选择,如下所示:
role = SelectField('Role', choices=UserRole.choices(blank=False), default=UserRole.recipient)
Run Code Online (Sandbox Code Playgroud)
请注意,函数参数blank提供了一个额外的空白 SelectField 选项,以防 SelectField 是可选的。在这种情况下,事实并非如此。
当我点击提交按钮时,我会检查路由中传入的传入请求,并通过打印给form.data我以下内容:
{'email': 'abc@gmail.com', 'password': 'fake', 'plan': 'A', 'confirm': 'fake', 'submit': True, 'id': None, 'role': 'UserRole.recipient'}
Run Code Online (Sandbox Code Playgroud)
如您所见,WTForms 似乎已将 UserRole.recipient 字符串化。有没有办法强制 WTForms 将传入的 POST 请求值转换回它预期的 Enum 值?
有没有办法强制 WTForms
您正在寻找的参数实际上被称为coerce,它接受一个可调用的,将字段的字符串表示形式转换为选项的值。
Enum实例str(Enum.value)Enum.name为了实现这一点,我扩展Enum了一些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)
Run Code Online (Sandbox Code Playgroud)
然后,您可以FormEnum使用以下命令编辑派生值SelectField:
role = SelectField(
"Role",
choices = UserRole.choices(),
coerce = UserRole.coerce)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2829 次 |
| 最近记录: |