我使用类似于此的代码生成WTForms字段:
my_field = QuerySelectField(
'My Field',
query_factory=lambda: MyClass.query
)
但在这种情况下,我收回了MyClass
类型的所有元素,并自动选择了第一个元素。
如果我以这种方式改变它:
my_field = QuerySelectField(
'My Field',
query_factory=lambda: MyClass.query,
allow_blank = True
)
默认选择现在为空,这就是我想要的,但空选择现在有效,而我希望它是一个错误。
有没有办法没有默认但仍然无法使选择可选?
答案 0 :(得分:2)
在该字段的表单中添加DataRequired
验证似乎是最简单的方法。
from wtforms import validators
my_field = QuerySelectField(
'My Field',
query_factory=lambda: MyClass.query,
allow_blank=True,
validators=[validators.DataRequired()]
)
答案 1 :(得分:0)
您可以创建自定义验证器来使 allow_blank = True
创建的默认选择无效。
使用 InputRequired()
或 DataRequired()
将不起作用,因为默认的“空白”选择的值为 __None
,因此允许 my_field
验证通过。
from wtforms.validators import ValidationError
class Form(FlaskForm):
my_field = QuerySelectField(
'My Field',
query_factory=lambda: MyClass.query,
allow_blank = True
)
@staticmethod
def validate_my_field(self, field):
if field.data is None:
raise ValidationError("Please select a value.")