Как правильно настроить приложение для использования модуля поля Django phonenumber? - PullRequest
1 голос
/ 05 марта 2020

Я использую 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."]}

Как еще можно настроить сервер на распознавание формата моего телефонного номера (или мне нужно изменить формат)?

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

Как сказано в документации:

Рекомендуется использовать один из глобально значимых форматов 'E164', 'INTERNATIONAL' или 'RFC3966'. Формат 'NATIONAL' требует установки PHONENUMBER_DEFAULT_REGION variabl

Поэтому вам необходимо установить регион по умолчанию. Например: PHONENUMBER_DEFAULT_REGION='US' в вашем settings.py.

1 голос
/ 13 марта 2020

Я вижу три способа достижения этого:

Вариант 1

Используйте RegEx валидатор внутри вашего PhoneNumberField:

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

Опция 2

В соответствии с документацией вы можете установить формат на NATIONAL, а затем установить регион. Таким образом, вы можете использовать в своих настройках:

PHONENUMBER_DB_FORMAT = 'NATIONAL'
PHONENUMBER_DEFAULT_REGION = 'US'

Опция 3

Использовать валидатор RegEx , но измените свое поле на CharField.

from django.core.validators import RegexValidator
...
phone = models.CharField(null=True, validators=[RegexValidator(r'^\d{3}-\d{3}-\d{4}$')])
0 голосов
/ 05 марта 2020

Используйте регулярное выражение для разрешения дефиса между ними. Это позволит эти форматы * 123-456-7890 * 333-333-4444 * 1234567890 * 123456789 * 123-4567-890 * 14157059247

Регулярное выражение ^\d{3}-\d{3}-\d{4}$

...