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

什么';这是在Django型号中存储电话号码的最佳方式,django,django-forms,django-validation,Django,Django Forms,Django Validation,我在型号中存储电话号码,如下所示: phone_number = models.CharField(max_length=12) 用户将输入一个电话号码,我将使用该电话号码进行SMS身份验证此应用程序将在全球范围内使用。所以我还需要国家代码。CharField是存储电话号码的好方法吗?我如何验证电话号码 这取决于你对电话号码的理解。电话号码因国家而异。几个国家的localflavors软件包都包含自己的“电话号码字段”。因此,如果您对特定国家/地区的情况感到满意,您应该看看localflavo

我在
型号中存储电话号码,如下所示:

phone_number = models.CharField(max_length=12)

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

这取决于你对电话号码的理解。电话号码因国家而异。几个国家的localflavors软件包都包含自己的“电话号码字段”。因此,如果您对特定国家/地区的情况感到满意,您应该看看localflavor软件包(
class us.models.PhoneNumberField
for us case,等等)


否则,您可以检查本地风味,以获得所有国家的最大长度。Localflavor还有表单字段,您可以将其与国家/地区代码结合使用来验证电话号码。

我将介绍我使用的内容:

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

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


渲染:我编写自定义模板标记以在模板中很好地渲染它。或者甚至像图片一样呈现,这样可以更安全地防止短信垃圾邮件。

验证很简单,只需给他们输入一点代码即可。CharField是储存它的好方法。我不太担心规范化电话号码。

你可以研究一下国际标准化的格式(他们有一个服务和一个通过REST请求发送短信或电话的API)

这可能是存储电话号码最普遍的方式,特别是当您使用国际号码时

1.电话号码字段 您可以使用
phonenumber\u字段
库。它是谷歌libphonenumber库的端口,该库支持Android的电话号码处理

在模型中:

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 
标准化电话串(用于测试和其他工作人员):

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."))

编辑

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

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

使用django电话号码字段:


对模型中的电话字段使用
CharField
,对表单验证使用
localflavor
应用程序:


其他提到的
django电话号码字段
。要获得所需的显示格式,您需要将
PHONENUMBER\u DEFAULT\u format
设置为
“E164”
“国际”
“国家”
、或
“RFC3966”
,以您希望的方式显示。请参阅。

此解决方案对我有效:

首先安装django电话字段

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_regex=RegexValidator(regex=r'^\+-1?\d{9,15}$',message=“电话号码必须以格式输入:'+999999'。最多允许15位。”)phone_number=models.CharField(validators=phone_regex,blank=True)不要忘记在模型中添加“max_length=15”。CharField@Esteban-max_length=16(开始时有一个可选的+)@我相信你不想在正则表达式中使用“1”。E.164最多允许15位数字,包括国家代码。实际上,E.164不包括任何国际呼叫前缀,只有国家代码后跟实际号码,而且似乎是8,因此正则表达式应该是
'^\+\d{8,15}$”
然后是
max_length=16
CharField
。这里有一个很好的建议:不要忘记添加区域。如果设置中没有
PHONENUMBER\u DEFAULT\u REGION='US'
,则不允许您输入美国用户识别为电话号码的任何内容。即使这样,这个包也不会输出为类似电话号码的内容。我肯定我还没有找到一个场景!注意:这个包裹很大。超过40MB。33MB的数据是地理数据。注意@Foreigner的评论,一个更轻量级的替代方案是,通过
pip install django phone field
@Foreigner,我们可以使用“lite”版本
pip install django phonenumber field[phonenumberslite]
,其中不包括地理编码,运营商和时区元数据我现在同意@rgenito(对于Django 3.x),我目前正在使用
Django电话号码字段
(使用
电话号码
)。
from phone_field import PhoneField
...

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