【问题标题】:How do I properly configure my app to use the Django phonenumber field module?如何正确配置我的应用程序以使用 Django 电话号码字段模块?
【发布时间】:2020-06-17 15:03:59
【问题描述】:

我正在使用 Django 2.0、Python 3.7 和 Django PhoneNumber 字段 -- https://github.com/stefanfoulis/django-phonenumber-field 并因此设置了我的模型...

class Coop(models.Model):
    name = models.CharField(max_length=250, null=False)
    type = models.ForeignKey(CoopType, on_delete=None)
    address = AddressField(on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True, null=False)
    phone = PhoneNumberField(null=True)
    email = models.EmailField(null=True)
    web_site = models.TextField()

我已经在我的 settings.py 文件中添加了这个...

PHONENUMBER_DB_FORMAT="RFC3966"

但是,当我使用以下 JSON 提交表单时...

{
        "name": "3999",
        "type": {
            "name": "Coworking Space"
        },
        "address": {
            "street_number": "222",
            "route": "1212",
            "raw": "222 W. Merchandise Mart Plaza, Suite 1212",
            "formatted": "222 W. Merchandise Mart Plaza, Suite 1212",
            "latitude": 41.88802611,
            "longitude": -87.63612199,
            "locality": {
                "name": "Chicago",
                "postal_code": "60654",
                "state": 1
            }
        },
        "enabled": true,
        "phone": "303-234-1234",
        "email": null,
        "web_site": "http://www.1871.com/"
}

我收到此错误(400 响应)...

{"phone":["The phone number entered is not valid."]}

我还能如何配置我的服务器以识别我的电话号码格式(或者我需要更改格式)?

【问题讨论】:

  • @kyore,试一试,但没有成功。

标签: python django python-3.x validation phone-number


【解决方案1】:

我看到了实现这一目标的三种方法:

选项 1

在您的PhoneNumberField 中使用RegEx validator

from django.core.validators import RegexValidator
...
phone = PhoneNumberField(null=True, validators=[RegexValidator(r'^\d{3}-\d{3}-\d{4}$')])

选项 2

根据文档,您可以将格式设置为NATIONAL,然后设置区域。因此,you can use 在您的设置中:

PHONENUMBER_DB_FORMAT = 'NATIONAL'
PHONENUMBER_DEFAULT_REGION = 'US'

选项 3

使用RegEx validator,但将您的字段更改为CharField

from django.core.validators import RegexValidator
...
phone = models.CharField(null=True, validators=[RegexValidator(r'^\d{3}-\d{3}-\d{4}$')])

【讨论】:

  • 我选择了选项 #2,它是赢家。
  • 选项 #2 FTW。谢谢
【解决方案2】:

如文档所述:

推荐使用具有全局意义的格式“E164”、“INTERNATIONAL”或“RFC3966”之一。 'NATIONAL' 格式需要设置 PHONENUMBER_DEFAULT_REGION 变量

所以你需要设置你的默认区域。例如:PHONENUMBER_DEFAULT_REGION='US' 在您的settings.py 中。

【讨论】:

  • 尝试将“PHONENUMBER_DEFAULT_REGION='US'”添加到我的 settings.py 文件中,但仍然出现错误。
【解决方案3】:

使用正则表达式允许在中间使用连字符。它将允许这些格式 * 123-456-7890 * 333-333-4444 * 1234567890 * 123456789 * 123-4567-890 * 14157059247

正则表达式^\d{3}-\d{3}-\d{4}$

【讨论】:

  • 在哪里使用正则表达式?
  • @Dave,在模式附近并在字段中调用它
  • 对不起,我不明白你在描述什么。
  • @Dave 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, unique=True)
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 2010-12-19
  • 2016-06-29
  • 2018-01-15
  • 2012-03-25
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多