如何在WTForms中将额外值传递给给定字段的process\formdata方法

2024-10-08 18:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有定制的ZIPCodeField,但它需要国家赋予正常工作, 在表单的init中,只需将其保存在表单的\u country属性中(同一表单中有fallback to 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.'))

但是for process_formdata方法有一个问题(我希望通过简单过滤器传递接收到的数据,以正确格式化邮政编码),我们没有表单实例,因此似乎有两种解决方案:

在现场层面拯救国家,比如:

^{pr2}$

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

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'})

哪一个是正确的解决方案?或者有更好的解决方案?在


Tags: selfform表单datadefcode国家zip
1条回答
网友
1楼 · 发布于 2024-10-08 18:30:31

所有这些都可以工作,但总的来说,我建议您也不要在表单中使用数据访问逻辑。这就造成了关注点的严重分离。在

表单有一个非常具体的任务,那就是验证表单提交。在您的例子中,您希望增加表单中提交的数据,然后对其进行验证。这不需要重写wtformsprocess方法。我将在中间件或视图中执行国家检索,将其附加到表单的提交数据中,然后正常验证表单。如果zipcode没有返回有效的国家或找不到,我会abort(400)就在那里。在

相关问题 更多 >

    热门问题