tutorial modelos examples example consultas avanzadas django django-forms django-validation

examples - modelos en django



¿Cuál es la mejor manera de almacenar el número de teléfono en los modelos de Django? (6)

Describiré lo que uso:

Validación: la cadena contiene más de 5 dígitos.

Limpieza: eliminando todos los símbolos que no sean dígitos, escriba en números solo db. Tengo suerte, porque en mi país (Rusia) todos tienen números de teléfono de 10 dígitos. Entonces almaceno en db solo 10 diits. Si escribe una solicitud para varios países, debe realizar una validación exhaustiva.

Rendering: escribo una etiqueta de plantilla personalizada para renderizarla en la plantilla. O incluso renderizarlo como una imagen: es más seguro evitar el spam de SMS.

Estoy almacenando el número de teléfono en un model como este:

phone_number = models.CharField(max_length=12)

El usuario ingresaría un número de teléfono y usaría el número de teléfono para la SMS Authentication Esta aplicación se usaría globalmente. Entonces también necesitaría un código de país. ¿Es CharField una buena forma de almacenar el número de teléfono? Y, ¿cómo valido el número de teléfono?

Gracias por adelantado


En realidad, puede buscar en el formato estandarizado internacionalmente E.164 , 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 manera más universal de almacenar números de teléfono, en particular si tiene números internacionales que funcionan.

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 e intentar contactar al número inmediatamente para verificar.

Creo que utilicé 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 puedes hacer algo como lo siguiente en tus modelos:

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


La validación es fácil, envíeles un pequeño código para escribir. Un CharField es una excelente manera de almacenarlo. No me preocuparía demasiado canonicalizar los números de teléfono.


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 localflavors para varios países contienen su propio "campo de número de teléfono". Por lo tanto, si está de acuerdo con ser un país específico, debería echarle un vistazo al paquete localflavor ( class us.models.PhoneNumberField for US case, etc.)

De lo contrario, podría inspeccionar los promotores locales para obtener la duración máxima para todos los países. Localflavor también tiene campos de formularios que puede usar junto con el código de país para validar el número de teléfono.