自动剥离()WTForms中的所有值?

Thi*_*ter 12 python wtforms

有没有办法从WTForms中的所有值中去除周围的空格而不向每个字段添加过滤器?

目前我正在将filters=[strip_whitespace]下面显示的功能传递给我的字段,但是必须为每个字段重复此操作非常难看.

def strip_whitespace(s):
    if isinstance(s, basestring):
        s = s.strip()
    return s
Run Code Online (Sandbox Code Playgroud)

需要子类化的解决方案Form很好,因为我已经在我的应用程序中这样做了.

Cra*_*ast 11

您可以使用bind_field原语在WTForms 2.x中执行此操作class Meta.该级元范式是覆盖在上下文WTForms行为,如绑定/实例字段,渲染领域,多方式.

因为在class MetaForm上定义的任何重写都被继承到任何表单子类,您可以使用它来设置具有所需行为的基本表单类:

class MyBaseForm(Form):
    class Meta:
        def bind_field(self, form, unbound_field, options):
            filters = unbound_field.kwargs.get('filters', [])
            filters.append(my_strip_filter)
            return unbound_field.bind(form=form, filters=filters, **options)


def my_strip_filter(value):
    if value is not None and hasattr(value, 'strip'):
        return value.strip()
    return value
Run Code Online (Sandbox Code Playgroud)

现在,只需继承MyBaseForm您的所有表格,就可以了.


Igo*_*gor 7

不幸的是,我没有足够的声誉来评论第一反应。但是,该示例中有一个非常令人不快的错误:当您执行 filters.append(smth) 时,每个表单初始化过滤器增长 1 个元素。结果,您的代码运行得越来越慢,直到您重新启动它

考虑示例:

   class MyBaseForm(Form):
        class Meta:
            def bind_field(self, form, unbound_field, options):
                filters = unbound_field.kwargs.get('filters', [])
                filters.append(my_strip_filter)
                return unbound_field.bind(form=form, filters=filters, **options)


    def my_strip_filter(value):
        if value is not None and hasattr(value, 'strip'):
            return value.strip()
        return value

    class MyCustomForm(MyBaseForm):
        some_field = StringField(filters=[lambda x: x])

    for i in range(100):
        MyCustomForm(MultiDict({'some_field': 'erer'}))

    print(len(MyCustomForm.some_field.kwargs['filters']))  # print: 101
Run Code Online (Sandbox Code Playgroud)

因此,快速解决方法是检查此过滤器是否不在列表中:

class MyBaseForm(Form):
    class Meta:
        def bind_field(self, form, unbound_field, options):
            filters = unbound_field.kwargs.get('filters', [])
            if my_strip_filter not in filters:
                filters.append(my_strip_filter)
        return unbound_field.bind(form=form, filters=filters, **options)
Run Code Online (Sandbox Code Playgroud)