首页 > 解决方案 > 使用烧瓶格式化电话号码以进行演示和数据库输入

问题描述

我正在编写一个带有由 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

标签: pythonpython-3.xflaskphone-numberwtforms

解决方案


虽然有点 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')

推荐阅读