【发布时间】: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'})
以下哪一个是正确的解决方案?还是有更好的解决方案?
【问题讨论】: