HOWTO · Django
I modi migliori per memorizzare i numeri di telefono in Django
Scopri diversi modi per memorizzare i numeri di telefono in Django.
In questa pagina
Per gestire numeri internazionali in un modello Django, usa django-phonenumber-field e il relativo PhoneNumberField: analizza e convalida i numeri usando metadati telefonici specifici per area geografica. Un validatore Django personalizzato può bastare se l’applicazione accetta un formato numerico ristretto e definito esplicitamente. In entrambi i casi, memorizza i numeri di telefono come testo, non come interi: un numero di telefono è un identificativo e la conversione in intero può eliminare il segno più iniziale o uno zero iniziale.
Esegui questo esempio:
phone_number = "+1 415 555 0132"
print(phone_number)
print(type(phone_number).__name__)
+1 415 555 0132
str
L’esempio mostra perché un numero di telefono va inserito in un campo stringa. Non analizza né convalida il numero; per queste operazioni con numeri internazionali, usa il pacchetto descritto di seguito.
Memorizzare i numeri di telefono con PhoneNumberField di un’app Django di terze parti
Installa django-phonenumber-field con una delle due opzioni: l’extra phonenumbers, che usa la versione Python più completa, oppure l’extra phonenumberslite, che usa il pacchetto di metadati più leggero. Per esempio, esegui python -m pip install "django-phonenumber-field[phonenumbers]" nell’ambiente del progetto. Per usare l’extra lite, sostituisci phonenumbers con phonenumberslite. Sono opzioni alternative: scegli in base alla copertura dei metadati di cui ha bisogno l’applicazione. Il progetto è mantenuto su django-phonenumber-field su GitHub. Usa python-phonenumbers, una versione Python della libreria libphonenumber di Google.
Aggiungi "phonenumber_field" a INSTALLED_APPS nelle impostazioni di Django. Poi importa PhoneNumberField da phonenumber_field.modelfields e dichiaralo in un modello, per esempio: phone_number = PhoneNumberField(unique=True). Per un numero facoltativo puoi usare phone_number = PhoneNumberField(blank=True, null=True). Includi il consueto import from django.db import models e inserisci queste dichiarazioni nella classe del modello. Sono frammenti che dipendono dal framework: richiedono Django e il pacchetto in un progetto configurato, quindi non sono esempi eseguibili autonomamente.
PhoneNumberField memorizza il valore come stringa e restituisce un oggetto numero di telefono utilizzabile per l’analisi, la convalida e la formattazione. Sono operazioni correlate, ma distinte: l’analisi interpreta l’input in base a un contesto geografico, la convalida lo confronta con i metadati dei piani di numerazione, la normalizzazione produce una rappresentazione canonica e la formattazione prepara il numero per la visualizzazione. Se gli utenti possono inserire numeri nel formato nazionale, scegli una regione predefinita nella configurazione Django; senza un contesto geografico sufficiente, questi numeri non possono essere interpretati in modo affidabile. Per accedere a un valore esistente, usa l’istanza del modello, per esempio person.phone_number; quando serve una rappresentazione E.164, usa la proprietà as_e164. Consulta la documentazione del progetto per i dettagli sulla configurazione e sul campo, e E.164 per il piano di numerazione internazionale.
Memorizzare i numeri di telefono con un validatore e un modello Django
Se l’applicazione accetta solo un formato numerico limitato e puoi definirne le regole, RegexValidator di Django può convalidare un CharField. Per esempio, importa RegexValidator da django.core.validators, definisci phone_number_validator = RegexValidator(regex=r"^\+?1?\d{8,15}$") e passalo a un campo del modello, come in phone_number = models.CharField(max_length=16, validators=[phone_number_validator], unique=True). Inserisci queste dichiarazioni in una classe del modello che importa models da django.db. È un esempio che dipende da Django e non è stato eseguito autonomamente.
Questa espressione definisce un formato ristretto, con un prefisso internazionale statunitense facoltativo e un intervallo specifico di cifre. Non convalida i numeri di telefono a livello globale, non verifica se un numero è assegnato e non equivale a PhoneNumberField. Usala solo se queste restrizioni corrispondono ai numeri accettati dall’applicazione; altrimenti, scegli l’approccio basato sul pacchetto oppure definisci un validatore che rispecchi i requisiti effettivi dell’applicazione.
E.164 consente al massimo 15 cifre; il segno + iniziale della rappresentazione internazionale è un carattere separato. Un campo max_length=16 può contenere questa rappresentazione, ma la lunghezza, da sola, non garantisce la sintassi E.164 né il rispetto delle regole di numerazione dei singoli paesi. Un validatore deve controllare il prefisso consentito e il numero di cifre; per una convalida internazionale più completa servono metadati dei piani di numerazione. Per entrambi i campi del modello, decidi in base al tuo modello dati se i numeri devono essere univoci e se il campo può essere vuoto o nullo.