Насправді ви можете заглянути в міжнародний стандартизований формат 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. Телефон за допомогою regexp
Одна примітка до вашої моделі: номери E.164 мають максимум 15 символів.
Для перевірки ви можете скористатися деякою комбінацією форматування, а потім спробувати зв’язатися з номером негайно для підтвердження.
Я вважаю, що я використав щось подібне до свого проекту джанго:
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."))
EDIT
Здається, що ця публікація була корисною для деяких людей, і, здається, варто її інтегрувати внизу коментаря в більш повноцінна відповідь. Відповідно до 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