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

新手上路,请多包涵

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

 phone_number = models.CharField(max_length=12)

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

原文由 pynovice 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您实际上可能会查看国际标准化格式 E.164例如 Twilio 推荐的 格式(它具有用于通过 REST 请求发送短信或电话的服务和 API)。

这可能是最通用的存储电话号码的方式,尤其是当您使用国际号码时。

  1. 按 PhoneNumberField 拨打电话

您可以使用 phonenumber_field 库。它是谷歌 libphonenumber 库的一个端口,支持 Android 的电话号码处理。参见 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

  1. 通过正则表达式打电话

针对您的型号的注意事项: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 is allowed."))


根据 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

原文由 erewok 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题