python - 使用烧瓶格式化电话号码以进行演示和数据库输入
问题描述
我正在编写一个带有由 Postgres 数据库支持的 wtforms 的烧瓶应用程序。
我希望用户以几乎任何格式输入电话号码NNN NNN NNNN
,, NNNNNNNNNN
,NNN-NNN-NNNN
等。
我想在没有任何分隔符的情况下将数字存储在数据库中NNNNNNNNNN
实现这一目标的最佳方法是什么?我尝试将 getter 和 setter 放在表单字段上,但是当字段未绑定时,这会破坏功能。
class myform(FlaskForm):
_phone=StringField('Phone #', validators=[Regexp("\d{3}[ ,-]?\d{3}[ ,-]?\d{4}"]
@propery
def phone(self)
return '{}-{}-{}'.format(self._phone[0:3],self._phone[3:6],self._phone[6:10])
@phone.setter
def phone(self, value):
value = value.replace(' ','')
value = value.replace('-','')
self._phone = value
解决方案
虽然有点 hacky,但您可以在用于验证的函数中编辑表单数据。
def reformat_phone(form, field):
field.data = field.data.replace('-', '')
return True
class PhoneForm(FlaskForm):
phone = StringField('Phone #', validators=[reformat_phone])
alright = SubmitField('submit')
其他选项包括编写您自己的电话字段类,并在process_formdata
那里重写函数。
编辑:
这是创建自己的字段的选项:
class PhoneField(StringField):
def process_formdata(self, valuelist):
self.data = [v.replace('-', '') for v in valuelist]
super().process_formdata(self.data)
class PhoneForm(FlaskForm):
phone = PhoneField('Phone #')
alright = SubmitField('submit')
推荐阅读
- python - 如何在 python 测试中修改内置开放路径?
- azure - 使用 azure 秘密提供程序类进行自定义
- postman - Postman 测试集合运行良好,所有测试都在 Postman 中通过,但所有测试都使用 Newman i 命令行失败
- rpc - 如何验证节点上运行的 RSK 版本?
- excel - 如果特定单元格没有值,VBA宏如何删除范围内的整行
- jqgrid - 在重新加载具有 Multiselect = true 的 JqGrid 后保留复选框的先前选中状态
- android-studio - Android Studio 无法生成 Javadoc(测试失败)
- r - R 中的 III 型 anova,模型中的别名系数
- entropy - 测量值熵的即时计算
- python - 如何根据时间增量删除重复行,同时保持该记录的最新出现?