Potresti effettivamente esaminare il formato standardizzato internazionale E.164 , raccomandato ad esempio da Twilio (che ha un servizio e un'API per inviare SMS o telefonate tramite richieste REST).
Questo è probabilmente il modo più universale per memorizzare i numeri di telefono, in particolare se si dispone di numeri internazionali.
1. Telefono via PhoneNumberField
Puoi usare la phonenumber_field
libreria. È la porta della libreria libphonenumber di Google, che alimenta la gestione dei numeri di telefono di Android
https://github.com/stefanfoulis/django-phonenumber-field
Nel modello:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
Far sapere:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Ottieni telefono come stringa dal campo oggetto:
client.phone.as_e164
Normolizza stringa di telefono (per test e altro personale):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
2. Telefonare con regexp
Una nota per il tuo modello: i numeri E.164 hanno una lunghezza massima di 15 caratteri.
Per convalidare, è possibile utilizzare una combinazione di formattazione e quindi tentare di contattare immediatamente il numero per verificare.
Credo di aver usato qualcosa di simile al mio progetto 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."))
MODIFICARE
Sembra che questo post sia stato utile per alcune persone, e sembra che valga la pena integrare il commento qui sotto in una risposta a tutti gli effetti. Secondo jpotter6 , puoi fare qualcosa di simile anche sui tuoi modelli:
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