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

时间:2013-10-02 06:11:16

标签: django django-forms django-validation

我正在model存储一个电话号码:

phone_number = models.CharField(max_length=12)

用户将输入电话号码,我将使用SMS Authentication的电话号码。此应用程序将在全球范围内使用。所以我还需要国家代码。 CharField是存储电话号码的好方法吗?而且,我该如何验证电话号码?

提前致谢。

9 个答案:

答案 0 :(得分:227)

您实际上可能会查看国际标准化格式E.164recommended by Twilio for example(有服务和API通过REST请求发送短信或电话)。

这可能是存储电话号码的最通用方式,特别是如果您使用国际号码。

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 

Normolize电话字符串(用于测试和其他工作人员):

    from phonenumber_field.phonenumber import PhoneNumber
    phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164

2。电话用regexp

您的型号的一个注释: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."))

编辑

看来这篇文章对一些人有用,将下面的评论整合到一个更全面的答案中似乎是值得的。根据{{​​3}},您可以在模型上执行以下操作:

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

答案 1 :(得分:42)

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

pip install django-phonenumber-field

答案 2 :(得分:5)

CharField用于模型中的电话字段,使用localflavor应用进行表单验证:

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

答案 3 :(得分:2)

验证很简单,只需输入一些代码就可以输入.CharField是存储它的好方法。我不会过分担心电话号码的规范化。

答案 4 :(得分:1)

这完全取决于您所理解的电话号码。电话号码是特定国家/地区多个国家/地区的localflavors包中包含自己的“电话号码字段”。因此,如果您确定具体国家/地区,则应查看localflavor包(美国案例class us.models.PhoneNumberField等)。

否则,你可以检查当地的风味,以获得所有国家的最大化。 Localflavor还有表单字段,您可以将其与国家/地区代码一起使用以验证电话号码。

答案 5 :(得分:1)

我将描述我使用的内容:

验证:字符串包含超过5位数字。

清理:删除所有非数字符号,写入仅限db的数字。我很幸运,因为在我的国家(俄罗斯),每个人都有10位数的电话号码。所以我只在db中存储10个diits。如果您正在编写多国申请,那么您应该进行全面的验证。

渲染:我编写自定义模板标签,很好地在模板中渲染它。或者甚至将其渲染成图片 - 防止短信垃圾邮件更安全。

答案 6 :(得分:1)

其他人提到了django-phonenumber-field。要获得所需的显示格式,需要将PHONENUMBER_DEFAULT_FORMAT设置为"E164""INTERNATIONAL""NATIONAL""RFC3966",但是要显示它。参见GitHub source

答案 7 :(得分:1)

此解决方案对我有用:

首先安装django-phone-field

command: pip install django-phone-field

然后在models.py

from phone_field import PhoneField
...

class Client(models.Model):
    ...
    phone_number = PhoneField(blank=True, help_text='Contact phone number')

以及settings.py

INSTALLED_APPS = [...,
                  'phone_field'
]

最后看起来像这样

phone in form

答案 8 :(得分:0)

使用django-phonenumber-field进行验证:https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field
pip install phonenumbers