是否可以在QuerySelectField中没有默认值而在验证中不允许空白?

时间:2018-02-22 16:46:17

标签: python wtforms flask-wtforms

我使用类似于此的代码生成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
)

默认选择现在为空,这就是我想要的,但空选择现在有效,而我希望它是一个错误。

有没有办法没有默认但仍然无法使选择可选?

2 个答案:

答案 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.")