【问题标题】:How to pass extra value to given field's process_formdata method in WTForms如何在 WTForms 中将额外值传递给给定字段的 process_formdata 方法
【发布时间】:2013-12-30 15:15:56
【问题描述】:

我有自定义 ZIPCodeField,但它需要提供国家/地区才能正常工作, 验证很容易,我可以将它保存在表单的 init 中的表单的 _country 属性中(在同一表单中回退到国家字段),它看起来像:

class ZIPCodeField(wtforms.TextField):
    def pre_validate(self, form):
        if not self.data:
            return

        country = country = getattr(form, '_country', form.data.get('country'))
        country = country.upper()

        if not validate_zip_code(self.data, country):
            raise ValueError(self.gettext(u'Invalid ZIP code.'))

但是对于 process_formdata 方法存在问题(我想通过简单的过滤器传递接收到的数据以正确格式化邮政编码),我们没有表单实例,所以似乎有两种解决方案:

在现场级别保存国家/地区,例如:

class ZIPCodeField(wtforms.TextField):

    def process_formdata(self, valuelist):
    if valuelist:
        self.data = format_zip_code(valuelist[0], self._country)
    else:
        self.data = ''

class TestForm(wtforms.Form):
    zip_code = ZIPCodeField()

form = TestForm(MultiDict([('zip_code', '123455')]))
form.zip_code._country = u'US'

或者,覆盖 process 方法并将我的额外值传递给它的 data 参数,例如:

class ZIPCodeField(wtforms.TextField):
    def process(self, formdata, data):
         # we picking country value from data here
         pass 

form = TestForm(MultiDict([('zip_code', '123455')]),
     zip_code=zip_code={'country': u'US'})

以下哪一个是正确的解决方案?还是有更好的解决方案?

【问题讨论】:

    标签: python forms wtforms


    【解决方案1】:

    所有这些都可以工作,但总的来说,我建议您也将数据访问逻辑排除在表单之外。这导致关注点分离不好。

    您的表单有一个非常具体的工作,那就是验证表单提交。在您的情况下,您想增加以表单提交的数据,然后对其进行验证。这不需要任何重写 wtforms process 方法。我会在中间件或视图中进行国家/地区检索,将其附加到表单的提交数据中,然后正常验证表单。如果邮政编码未返回有效国家/地区或未找到,我会在此处abort(400)

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多