En realidad, puede buscar el formato E.164 estandarizado internacionalmente , recomendado por Twilio por ejemplo (que tiene un servicio y una API para enviar SMS o llamadas telefónicas a través de solicitudes REST).
Es probable que esta sea la forma más universal de almacenar números de teléfono, en particular si tiene números internacionales con los que trabajar.
1. Teléfono por teléfonoNumberField
Puedes usar la phonenumber_field
biblioteca. Es el puerto de la biblioteca libphonenumber de Google, que impulsa el manejo del número de teléfono de Android
https://github.com/stefanfoulis/django-phonenumber-field
En modelo:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
En forma:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Obtener el teléfono como una cadena del campo de objeto:
client.phone.as_e164
Normolize cadena telefónica (para pruebas y otro personal):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
2. Teléfono por regexp
Una nota para su modelo: los números E.164 tienen una longitud máxima de 15 caracteres.
Para validar, puede emplear alguna combinación de formato y luego intentar contactar el número inmediatamente para verificar.
Creo que usé algo como lo siguiente en mi proyecto 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."))
EDITAR
Parece que esta publicación ha sido útil para algunas personas, y parece que vale la pena integrar el comentario a continuación en una respuesta más completa. Según jpotter6 , también puede hacer algo como lo siguiente en sus modelos:
modelos.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