Answers:
实际上,您可能会研究国际标准格式E.164,例如Twilio推荐的格式(该服务具有通过REST请求发送SMS或电话的服务和API)。
这可能是最通用的电话号码存储方式,特别是如果您使用国际号码时。
您可以使用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
型号注意事项: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
'^\+\d{8,15}$'
,然后max_length=16
为CharField
。
使用django-phonenumber-field:https : //github.com/stefanfoulis/django-phonenumber-field
pip install django-phonenumber-field
PHONENUMBER_DEFAULT_REGION = 'US'
设置,则不允许您输入美国用户会识别为电话号码的任何内容。即使这样,此程序包也不会输出为类似于电话号码的内容。。。我确定还有一个我还没有找到的设置!
pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
不包含地理编码,运营商和时区元数据的“精简版”
使用CharField
在模型和手机领域localflavor
的表单验证的应用程序:
https://docs.djangoproject.com/zh-CN/1.7/topics/localflavor/
我将描述我所使用的:
验证:字符串包含5个以上的数字。
清洁:删除所有非数字符号,仅在db中写入数字。我很幸运,因为在我们的国家(俄罗斯),每个人都有10位数字的电话号码。所以我在数据库中只存储10位。如果要编写多国应用程序,则应进行全面的验证。
渲染:我编写了自定义模板标签,以在模板中很好地渲染它。甚至将其渲染为图片-防止垃圾短信更加安全。
其他人提到django-phonenumber-field
。为了让你想怎么你需要设置显示格式PHONENUMBER_DEFAULT_FORMAT
设置"E164"
,"INTERNATIONAL"
,"NATIONAL"
,或"RFC3966"
,但是你想让它显示出来。参见GitHub源码。