Estoy almacenando un número de teléfono model
como este:
phone_number = models.CharField(max_length=12)
El usuario ingresaría un número de teléfono y yo usaría el número de teléfono para SMS Authentication
Esta aplicación se usaría globalmente. Entonces también necesitaría el código del país. ¿Es CharField
una buena manera de almacenar el número de teléfono? ¿Y cómo valido el número de teléfono?
django
django-forms
django-validation
pynovice
fuente
fuente
Respuestas:
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-fieldEn modelo:
En forma:
Obtener el teléfono como una cadena del campo de objeto:
Normolize cadena telefónica (para pruebas y otro personal):
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:
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:
fuente
'^\+\d{8,15}$'
y luegomax_length=16
para elCharField
.Utilice django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
fuente
PHONENUMBER_DEFAULT_REGION = 'US'
la configuración, no le permitirá ingresar nada que los usuarios de los Estados Unidos reconozcan como un número de teléfono. Incluso entonces, este paquete no saldrá como algo que parece un número de teléfono. . . ¡Estoy seguro de que hay una configuración que todavía no he encontrado!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
que no incluye los metadatos de geocodificación, portador y zona horariaUse
CharField
para el campo del teléfono en el modelo y lalocalflavor
aplicación para la validación de formularios:https://docs.djangoproject.com/en/1.7/topics/localflavor/
fuente
La validación es fácil, envíeles un pequeño código de texto para escribir. Un CharField es una excelente manera de almacenarlo. No me preocuparía demasiado por canonizar los números de teléfono.
fuente
Todo depende de lo que entiendas como número de teléfono. Los números de teléfono son específicos del país. Los paquetes de sabores locales para varios países contienen su propio "campo de número de teléfono". Entonces, si está de acuerdo en ser específico del país, debe echar un vistazo al paquete de sabor local (
class us.models.PhoneNumberField
para el caso de EE. UU., Etc.)De lo contrario, podría inspeccionar los sabores locales para obtener la longitud máxima para todos los países. Localflavor también tiene campos de formularios que puede usar junto con el código del país para validar el número de teléfono.
fuente
Describiré lo que uso:
Validación: la cadena contiene más de 5 dígitos.
Limpieza: elimina todos los símbolos que no sean dígitos, escriba solo números db. Tengo suerte, porque en mi país (Rusia) todos tienen números de teléfono con 10 dígitos. Así que guardo en db solo 10 diits. Si está escribiendo una aplicación para varios países, debe realizar una validación completa.
Representación: escribo una etiqueta de plantilla personalizada para representarla en la plantilla de forma agradable. O incluso renderizarlo como una imagen: es más seguro evitar el spam de sms.
fuente
Otros mencionados
django-phonenumber-field
. Para obtener el formato de visualización de cómo desea que necesita para configurarPHONENUMBER_DEFAULT_FORMAT
ajuste para"E164"
,"INTERNATIONAL"
,"NATIONAL"
, o"RFC3966"
, como quiera que se muestre. Ver la fuente de GitHub .fuente