我有一个名为fax
的字段。它以不同的形式返回传真号码。例如,它可能是1-800 222-2222
。我想创建一个属性compress_fax
获取一个没有任何其他信息而不是数字的产品。因此,该属性会将1-800 222-2222
更改为18002222222
。我怎么能这样做?
from loanwolf.fields import PhoneField
fax = PhoneField(_('Fax'), max_length=50, blank=True, null=True)
和
class PhoneField(models.CharField):
"""
450 123 4567
450 123 4567 ext 123456
"""
description = "A North American phone number with optional extension"
default_error_messages = {
'invalid': _('Please enter a valid phone number'),
}
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 30
super(PhoneField, self).__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super(PhoneField, self).deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs
def validate(self, value, model_instance):
# We only check that the first 10 digits are numbers
super(PhoneField, self).validate(value, model_instance)
_val = value.replace(' ', '').replace('-', '')[:10]
if not re.match(r'\d{10}', _val):
raise ValidationError(self.error_messages['invalid'], code='invalid')
return value
def pre_save(self, model_instance, add):
value = super(PhoneField, self).pre_save(model_instance, add)
return format_phone(value)
提前致谢!
答案 0 :(得分:0)
您可以使用正则表达式来执行此操作。
例如,假设您有以下型号:
import re
class Foo(models.Model):
fax = models.CharField()
...
@property
def compress_fax(self):
return re.sub('[^0-9]', '', self.fax)
这将删除fax
字符串中的任何非数字值。