在Django模型中存储电话号码的最佳方式是什么?

我在这样的model存储电话号码:

 phone_number = models.CharField(max_length=12) 

用户将input一个电话号码,我会使用电话号码进行SMS Authentication这个应用程序将在全球范围内使用。 所以我也需要国家代码。 CharField是存储电话号码的好方法吗? 而且,我如何validation电话号码?

提前致谢

实际上,你可能会看看国际标准化的E.164格式, 例如Twilio推荐的 (他们有一个服务和一个通过REST请求发送SMS或电话的API)。

这可能是存储电话号码的最普遍的方式,特别是如果你有国际号码的话。

一个音符为您的模型:E.164数字的最大字符长度为15。

要validation,您可以使用格式组合,然后尝试立即联系号码进行validation。

我相信我在我的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=15, blank=True) # validators should be a list 

使用django-phonenumber-field: https : //github.com/stefanfoulis/django-phonenumber-field

 pip install django-phonenumber-field 

validation非常简单,只需input一些简单的代码即可.CharField是存储它的好方法。 我不会太担心电话号码的标准化。

在模型中使用CharField进行手机字段,使用localflavor应用程序进行表单validation:

https://docs.djangoproject.com/en/1.7/topics/localflavor/

这一切都取决于你所理解的电话号码。 电话号码是国家特定的。 几个国家的本地包装包含自己的“电话号码字段”。 所以,如果你确定国家特定的,你应该看看localflavor包(美国的情况下, class us.models.PhoneNumberField等)

否则,你可以检查当地的食品,以获得所有国家的最大长度。 Localflavor也有表格字段,您可以使用国家代码来validation电话号码。

我将描述我使用的是什么:

validation:string包含5位以上的数字。

清理:删除所有非数字符号,写入数据库唯一的数字。 我很幸运,因为在我的国家(俄罗斯)每个人都有10位数字的电话号码。 所以我存储在分贝只有10迪。 如果你正在编写多国应用程序,那么你应该做一个全面的validation。

渲染:我写了自定义的模板标签,很好地将其呈现在模板中。 或者甚至把它像一张图片 – 防止短信垃圾邮件更安全。