仅保留数字 - 创建方法

时间:2017-05-17 15:52:38

标签: django

我有一个名为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)

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式来执行此操作。

例如,假设您有以下型号:

import re

class Foo(models.Model):
    fax = models.CharField()
    ...

    @property
    def compress_fax(self):
        return re.sub('[^0-9]', '', self.fax)

这将删除fax字符串中的任何非数字值。