Вы могли бы действительно изучить международно стандартизованный формат E.164 , например , рекомендованный Twilio (у которого есть служба и API для отправки SMS или телефонных звонков через запросы REST).
Это, вероятно, будет наиболее универсальным способом хранения телефонных номеров, особенно если у вас есть международные номера.
1. Телефон по PhoneNumberField
Вы можете использовать phonenumber_field
библиотеку. Это порт библиотеки libphonenumber от Google, которая обеспечивает обработку телефонных номеров 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