我有定制的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'})
哪一个是正确的解决方案?或者有更好的解决方案?在
所有这些都可以工作,但总的来说,我建议您也不要在表单中使用数据访问逻辑。这就造成了关注点的严重分离。在
表单有一个非常具体的任务,那就是验证表单提交。在您的例子中,您希望增加表单中提交的数据,然后对其进行验证。这不需要重写wtforms
process
方法。我将在中间件或视图中执行国家检索,将其附加到表单的提交数据中,然后正常验证表单。如果zipcode没有返回有效的国家或找不到,我会abort(400)
就在那里。在相关问题 更多 >
编程相关推荐