【问题标题】:Validating an unknown set of items with WTForms使用 WTForms 验证一组未知的项目
【发布时间】:2013-05-16 18:59:55
【问题描述】:

我有一个看起来像这样的表单:

<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,因为这似乎需要一个选择列表,而我不知道选择列表(它是由第 3 方动态提供给我的)。

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

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

谢谢

【问题讨论】:

    标签: python flask wtforms


    【解决方案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')
    

    这暂时有效,但我不确定是否有办法使用内置字段和验证器来做到这一点。

    【讨论】:

      猜你喜欢
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2017-01-26
      • 2019-04-02
      • 2018-09-12
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多