在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:
这一切都取决于你所理解的电话号码。 电话号码是国家特定的。 几个国家的本地包装包含自己的“电话号码字段”。 所以,如果你确定国家特定的,你应该看看localflavor包(美国的情况下, class us.models.PhoneNumberField
等)
否则,你可以检查当地的食品,以获得所有国家的最大长度。 Localflavor也有表格字段,您可以使用国家代码来validation电话号码。
我将描述我使用的是什么:
validation:string包含5位以上的数字。
清理:删除所有非数字符号,写入数据库唯一的数字。 我很幸运,因为在我的国家(俄罗斯)每个人都有10位数字的电话号码。 所以我存储在分贝只有10迪。 如果你正在编写多国应用程序,那么你应该做一个全面的validation。
渲染:我写了自定义的模板标签,很好地将其呈现在模板中。 或者甚至把它像一张图片 – 防止短信垃圾邮件更安全。