您实际上可能会研究国际标准化格式E.164、recommended by Twilio for example(它们具有通过 REST 请求发送 SMS 或电话的服务和 API)。
这可能是最通用的电话号码存储方式,尤其是在您使用国际号码的情况下。
1。按 PhoneNumberField 拨打电话
您可以使用phonenumber_field 库。它是 Google 的 libphonenumber 库的端口,它支持 Android 的电话号码处理
https://github.com/stefanfoulis/django-phonenumber-field
在模型中:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
形式:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
从对象字段中获取电话作为字符串:
client.phone.as_e164
标准化电话字符串(用于测试和其他工作人员):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
2。通过正则表达式拨打电话
您的模型的一个注意事项:E.164 数字的最大字符长度为 15。
要进行验证,您可以采用某种格式组合,然后尝试立即联系该号码进行验证。
我相信我在我的 django 项目中使用了类似以下内容:
class ReceiverForm(forms.ModelForm):
phone_number = forms.RegexField(regex=r'^\+?1?\d{9,15}$',
error_message = ("Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."))
编辑
看来这篇文章对某些人很有用,将下面的评论整合到一个更完整的答案中似乎是值得的。根据jpotter6,您也可以在您的模型上执行以下操作:
models.py:
from django.core.validators import RegexValidator
class PhoneModel(models.Model):
...
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
phone_number = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list