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

phone_number = models.CharField(max_length=12)

用户将输入一个电话号码,我将使用电话号码为SMS Authentication,这个应用程序将被全球使用.所以我还需要国家代码.CharField是储存电话号码的好方法吗?那么,我怎么验证这个电话号码呢?

推荐答案

你可能真的会研究一下国际标准化格式E.164recommended by Twilio for example(他们有通过睡觉请求发送短信或电话的服务和应用编程接口).

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

1.通过PhoneNumberField拨打电话

你可以使用phonenumber_field图书馆.它是Google的libhonenumber库的端口,该库为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()

从Object字段获取字符串形式的电话:

    client.phone.as_e164 

标准化电话串(用于测试和其他工作人员):

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

2.regexp电话

请注意:E.164数字的最大字符长度为15.

为了验证,您可以使用一些格式组合,然后try 立即联系号码进行验证.

我相信我在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."))

EDIT

这篇帖子似乎对一些人很有用,把下面的 comments 整合成一个更全面的答案似乎是值得的.根据jpotter6,您也可以在您的模型上执行以下操作:

模型.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相关问答推荐

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

DRF中没有参数的视图的警告-壮观

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

如何组织 Django REST Framework url

如何在 django 中修改现有模型实例?

Django 有脚手架吗?

Django 长时间运行带有线程/处理的异步任务

Django 模型中的隐藏字段

如何在 forms.Form 子类上动态设置 models.ModelChoiceField 的查询集

(fields.E300) 字段定义与模型的关系,该模型要么未安装,要么是抽象的

测试 Django ModelForm 是否有实例

Django - 来自 QuerySet 的唯一列表

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

在 Django 中使用 Cython,是否有意义?

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

在 Django 中使用 LiveServerTestCase 时使用代码登录

Django unique_together 与可为空的 ForeignKey

Django:按位置排序,忽略 NULL

如何将类、id、占位符属性添加到 django 模型表单中的字段

我将如何package打包和销售 Django 应用程序?