Я храню номер телефона model
так:
phone_number = models.CharField(max_length=12)
Пользователь должен ввести номер телефона, и я буду использовать этот номер телефона, чтобы SMS Authentication
это приложение использовалось глобально. Так что мне также понадобится код страны. Есть CharField
хороший способ сохранить номер телефона? И как мне подтвердить номер телефона?
django
django-forms
django-validation
pynovice
источник
источник
Ответы:
Вы могли бы действительно изучить международно стандартизованный формат E.164 , например , рекомендованный Twilio (у которого есть служба и API для отправки SMS или телефонных звонков через запросы REST).
Это, вероятно, будет наиболее универсальным способом хранения телефонных номеров, особенно если у вас есть международные номера.
1. Телефон по PhoneNumberField
Вы можете использовать
phonenumber_field
библиотеку. Это порт библиотеки libphonenumber от Google, которая обеспечивает обработку телефонных номеров Android https://github.com/stefanfoulis/django-phonenumber-field.В модели:
Поставить в известность:
Получить телефон в виде строки из поля объекта:
Нормировать телефонную строку (для тестов и прочего персонала):
2. Телефон с помощью регулярного выражения
Одно примечание для вашей модели: номера E.164 имеют максимальную длину 15 символов.
Для проверки вы можете использовать некоторую комбинацию форматирования, а затем немедленно попытаться связаться с номером для проверки.
Я считаю, что в своем проекте django использовал что-то вроде следующего:
РЕДАКТИРОВАТЬ
Похоже, что этот пост был полезен для некоторых людей, и кажется, что стоит интегрировать комментарий ниже в более полноценный ответ. Согласно jpotter6 , вы также можете сделать что-то вроде следующего на своих моделях:
models.py:
источник
'^\+\d{8,15}$'
а затемmax_length=16
дляCharField
.Используйте поле django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
источник
PHONENUMBER_DEFAULT_REGION = 'US'
настроек он не позволит вам вводить что-либо, что пользователи из США распознают как номер телефона. Даже в этом случае этот пакет не будет выводиться как нечто похожее на номер телефона. , , Я уверен, что есть настройка, которую я еще не нашел!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
которая не включает метаданные геокодирования, оператора связи и часового поясаИспользуйте
CharField
поле для телефона в модели и вlocalflavor
приложении для проверки формы:https://docs.djangoproject.com/en/1.7/topics/localflavor/
источник
Проверка проста, напишите им небольшой код для ввода. CharField - отличный способ его сохранить. Я бы не стал слишком беспокоиться о канонизации телефонных номеров.
источник
Все зависит от того, что вы понимаете под номером телефона. Номера телефонов зависят от страны. Пакеты localflavors для нескольких стран содержат собственное «поле номера телефона». Так что, если вас устраивает конкретная страна, вам следует взглянуть на пакет localflavor (
class us.models.PhoneNumberField
для случая США и т. Д.)В противном случае вы могли бы изучить местные вкусы, чтобы получить максимальную длину для всех стран. Localflavor также имеет поля форм, которые вы можете использовать вместе с кодом страны для проверки номера телефона.
источник
Опишу, что использую:
Проверка: строка содержит более 5 цифр.
Очистка: удаление всех нецифровых символов, запись в БД только цифр. Мне повезло, потому что в моей стране (России) у всех есть 10-значные телефонные номера. Так что я храню в db только 10 диитов. Если вы пишете заявку для нескольких стран, вам следует провести всестороннюю проверку.
Рендеринг: я пишу собственный тег шаблона, чтобы он красиво отображался в шаблоне. Или даже визуализировать его как картинку - так безопаснее предотвратить смс-спам.
источник
Упомянутые другие
django-phonenumber-field
. Чтобы получить формат отображения , как вы хотите , вам необходимо установитьPHONENUMBER_DEFAULT_FORMAT
настройки для"E164"
,"INTERNATIONAL"
,"NATIONAL"
или"RFC3966"
же вы хотите отображаться на дисплее. См. Исходный код на GitHub .источник