Какой лучший способ сохранить номер телефона в моделях Django

Вопрос: Я храню номер телефона в model как это: phone_number = models.CharField(max_length=12) Пользователь будет вводить номер телефона, и я буду использовать номер телефона для SMS Authentication Это приложение будет использоваться во всем мире. Поэтому мне также понадобится код страны. Является ли CharField хорошим способом хранения номера телефона? И как мне проверить номер телефона? Заранее спасибо.

Вопрос:

Я храню номер телефона в model как это:

phone_number = models.CharField(max_length=12)

Пользователь будет вводить номер телефона, и я буду использовать номер телефона для SMS Authentication Это приложение будет использоваться во всем мире. Поэтому мне также понадобится код страны. Является ли CharField хорошим способом хранения номера телефона? И как мне проверить номер телефона?

Заранее спасибо.

Лучший ответ:

Вы можете взглянуть на международный стандартизированный формат E.164, рекомендованный, например, Twilio (у которого есть сервис и API для отправки SMS или телефонных звонков через запросы REST).

Это, вероятно, самый универсальный способ хранения телефонных номеров, особенно если вы работаете с международными номерами.

1. Телефон по PhoneNumberField

Вы можете использовать библиотеку phonenumber_field. Это порт библиотеки Google 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

2. Телефон по регулярному выражению

Одно замечание для вашей модели: максимальная длина символа 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 Ответ №1

Использовать поле django-phonenumber:
https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field Ответ №2

Используйте CharField для телефона в модели и приложение localflavor для проверки формы:

Ответ №3

Проверка проста, назовите их небольшим кодом для ввода. CharField – отличный способ его сохранить. Я не стал бы слишком беспокоиться о канонизации номеров телефонов.

Ответ №4

Все зависит от того, что вы понимаете как номер телефона. Номера телефонов специфичны для страны. Пакеты localflavors для нескольких стран содержат свое собственное поле “номер телефона”. Так что, если вы в порядке, специфические для страны, вы должны взглянуть на пакет localflavor (class us.models.PhoneNumberField для случая в США и т.д.).

В противном случае вы можете проверить локальных злоумышленников, чтобы получить максимальную длину для всех стран. Localflavor также имеет поля форм, которые вы могли бы использовать в сочетании с кодом страны для подтверждения номера телефона.

Ответ №5

Я опишу, что я использую:

Валидация: строка содержит более 5 цифр.

Очистка: удаление всех символов без цифр, запись только в числах. Мне повезло, потому что в моей стране (Россия) у всех есть номера телефонов с 10 цифрами. Поэтому я храню в db всего 10 децитов. Если вы пишете многостраничное приложение, вы должны сделать всестороннюю проверку.

Рендеринг: я пишу специальный тег шаблона, чтобы сделать его в шаблоне красиво. Или даже сделать это как изображение – безопаснее предотвращать спам-спам.

Ответ №6

Используйте поле django-phonenumber-field для проверки: https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field pip install phonenumbers

Оцените статью
Добавить комментарий