使用WTForms验证一组未知项目

时间:2013-05-16 18:59:55

标签: python flask wtforms

我的表单看起来像这样:

<form method="post">
    <input id="1" name="people" type="checkbox" value="1"/>
    <label for="1">Paul</label>

    <input id="2" name="people" type="checkbox" value="2"/>
    <label for="2">Elizabeth</label>

    <input type="submit"/>
</form>

提交此表单时,我想验证用户是否已检查过至少一个人。请注意,我不想使用name"person-0"name="person-1",我实际上想要使用name="people"作为我的对象的名称。

我会用这样的东西创建我的表单......

class MyForm(Form):
    some_field = fields.TextField(u'Some Field', [validators.required()])
    some_option = fields.BooleanField(u'Some Option')
    people = # What to put here?

那么,我可以在'人物'字段中使用哪种类型的字段?

我认为我不能使用FieldList,因为我希望名称为person-0person-1而不是people,这是我不想要的。我不能使用SelectMultipleField,因为这似乎需要一个选择列表,我不知道选择列表(它是由第三方动态提供给我的。)

我只是使用表单来验证生成的HTML帖子数据,而不是渲染HTML,所以不用担心。

我将发布我所做的答案,即使用自定义字段。但我想知道是否有一些方法可以使用内置字段在wtforms中执行此操作。

由于

1 个答案:

答案 0 :(得分:1)

以下是我到目前为止所做的事情:

我创建了一个名为“ListField”的字段......

class ListField(Field):
    def process_formdata(self, valuelist):
        self.data = valuelist

然后我可以像下面那样使用它:

class MyForm(Form):
    some_field = fields.TextField(u'Some Field', [validators.required()])
    some_option = fields.BooleanField(u'Some Option')
    people = ListField()

    def validate_people(self, field):
        if len(field.data) == 0:
            raise ValidationError('Must select at least one person')

现在可以使用,但我不确定是否有办法使用内置字段和验证器来执行此操作。