当前位置: 首页 > 知识库问答 >
问题:

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

公羊俊
2023-03-14

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

phone_number = models.CharField(max_length=12)

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


共有3个答案

左丘烨烁
2023-03-14

使用CharField用于模型中的phone字段,并使用localstyle应用程序进行表单验证:

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

更新(29021-12-07)。看起来LocalFlavor不再是Django的一部分:

https://pypi.org/project/django-localflavor/

太叔鸿博
2023-03-14

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

pip install django-phonenumber-field
邴墨竹
2023-03-14

您可以实际查看国际标准化格式E.164,例如Twilio推荐的格式(他们有通过REST请求发送短信或电话的服务和应用编程接口)。

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

您可以使用phonenumber\u字段库。它是谷歌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 

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

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

模型需要注意的一点是: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."))

编辑

这篇文章似乎对一些人很有用,而且似乎值得将下面的评论整合到一个更全面的答案中。根据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=17, blank=True) # validators should be a list
 类似资料:
  • 问题内容: 我这样存储电话号码: 用户将输入电话号码,而我将使用该电话号码。此应用程序将在全球范围内使用。因此,我还需要国家代码。是存储电话号码的好方法吗?而且,我该如何验证电话号码? 问题答案: 你实际上可能会研究国际标准格式E.164,例如Twilio推荐的格式(该服务具有通过REST请求发送SMS或电话的服务和API)。 这可能是最普遍的电话号码存储方式,尤其是在你使用国际号码的情况下。 1

  • 问题内容: 如果我只有10个或更多数字的字符串,如何将其格式化为电话号码? 一些简单的例子: 我知道这些并不是格式化它们的唯一方法,而且如果我自己做的话,很有可能我会放弃。有python库或格式化电话号码的标准方法吗? 问题答案: 对于库:电话号码(pypi,源) Google通用库的Python版本,用于解析,格式化,存储和验证国际电话号码。 自述文件不足,但是我发现代码记录清楚。

  • 问题内容: 目前,我的代码中有很多类似于以下内容的python对象: 现在,我想将其转换为Django模型,其中self.myName是字符串字段,而self.myFriends是字符串列表。 由于列表是python中如此常见的数据结构,因此,我希望其中有一个Django模型字段。我知道我可以使用ManyToMany或OneToMany关系,但是我希望避免代码中的额外间接访问。 问题答案: 将这种

  • 错误1264(22003):超出第1行“phone”列的范围值 为什么在错误…手机大小100但为什么超出范围…

  • 问题内容: 我在一个应用程序中无法代表手机号码。 我想知道是否有一个Integer类,它将允许您存储从0417254482开始的数字。也许使用字符串更合适?目前,当我尝试使用整数形式表示电话号码时,我似乎存储的是随机数而不是我打算存储的数字。 问题答案: 使用。除了其他以外,如果使用整数,则将无法存储前导零。你绝对不应该使用(太小)或(数据丢失的风险太大-参见下文);或可能是适当的(除了前导零问题

  • 问题内容: 您知道django密码的存储方式如下: 那就是“ hashtype $ salt $ hash”。我的问题是,他们如何获得$哈希?是将密码和salt组合在一起,然后进行哈希处理,还是完全其他? 问题答案: 与往常一样,使用源: 如我们所见,密码摘要是通过使用选定的哈希算法将盐和密码连接起来而制成的。然后,将算法名称,原始盐和密码哈希进行合并,并用“ $”分隔以构成摘要。 为了验证密码,