HOWTO · Django

Meilleures façons de stocker des numéros de téléphone dans Django

Découvrez plusieurs façons de stocker des numéros de téléphone dans Django.

Sur cette page

Pour gérer des numéros internationaux dans un modèle Django, utilisez django-phonenumber-field et son PhoneNumberField : le package analyse et valide les numéros à l’aide de métadonnées téléphoniques tenant compte de la région. Un validateur Django personnalisé peut suffire si votre application accepte un format de numéro restreint et défini explicitement. Dans les deux cas, stockez les numéros de téléphone sous forme de texte, et non d’entiers : un numéro est un identifiant, et sa conversion en entier peut supprimer le signe plus ou le zéro initial.

Exécutez cet exemple :

phone_number = "+1 415 555 0132"
print(phone_number)
print(type(phone_number).__name__)
+1 415 555 0132
str

Cet exemple montre pourquoi un numéro de téléphone doit être stocké dans un champ de type chaîne. Il n’analyse ni ne valide le numéro ; si vous devez effectuer ces opérations sur des numéros internationaux, utilisez le package présenté ci-dessous.

Stocker des numéros de téléphone avec le PhoneNumberField d’une application Django tierce

Installez django-phonenumber-field avec l’extra phonenumbers, qui fournit le port Python le plus complet, ou avec l’extra phonenumberslite, qui fournit un jeu de métadonnées plus léger. Par exemple, exécutez python -m pip install "django-phonenumber-field[phonenumbers]" dans l’environnement de votre projet. Pour utiliser l’extra allégé, remplacez phonenumbers par phonenumberslite. Ces extras sont des choix alternatifs : choisissez celui qui correspond à la couverture des métadonnées dont votre application a besoin. Le projet est maintenu sur django-phonenumber-field sur GitHub. Il s’appuie sur python-phonenumbers, un portage Python de libphonenumber de Google.

Ajoutez "phonenumber_field" à INSTALLED_APPS dans les paramètres de Django. Importez ensuite PhoneNumberField depuis phonenumber_field.modelfields et déclarez-le dans un modèle, par exemple : phone_number = PhoneNumberField(unique=True). Pour un numéro facultatif, vous pouvez utiliser phone_number = PhoneNumberField(blank=True, null=True). Ajoutez l’import habituel from django.db import models et placez ces déclarations dans la classe de votre modèle. Ces extraits dépendent du framework : ils nécessitent Django et le package dans un projet configuré et ne constituent donc pas des exemples autonomes exécutables.

PhoneNumberField stocke la valeur sous forme de chaîne et fournit un objet numéro de téléphone pour l’analyse, la validation et le formatage. Ces opérations sont liées, mais distinctes : l’analyse interprète la saisie en fonction d’une région, la validation la vérifie au regard des métadonnées du plan de numérotation, la normalisation produit une représentation canonique et le formatage prépare une présentation lisible. Configurez une région par défaut dans Django si les utilisateurs peuvent saisir des numéros au format national ; sans contexte régional suffisant, ces saisies ne peuvent pas être interprétées de manière fiable. Pour accéder à la valeur d’un enregistrement existant, utilisez l’instance du modèle, par exemple person.phone_number, puis sa propriété as_e164 lorsque vous avez besoin d’une représentation E.164. Consultez la documentation du projet pour la configuration et les détails du champ, ainsi que E.164 pour le plan de numérotation international.

Stocker des numéros de téléphone avec un validateur et un modèle Django

Si l’application n’accepte qu’un format de numéro limité et que vous pouvez en définir les règles, le RegexValidator de Django peut valider un CharField. Par exemple, importez RegexValidator depuis django.core.validators, définissez phone_number_validator = RegexValidator(regex=r"^\+?1?\d{8,15}$"), puis transmettez-le à un champ de modèle : phone_number = models.CharField(max_length=16, validators=[phone_number_validator], unique=True). Placez ces déclarations dans une classe de modèle qui importe models depuis django.db. Cette illustration dépend de Django et n’a pas été exécutée comme exemple autonome.

Cette expression correspond à un motif restreint, avec un indicatif de pays américain facultatif et une plage de longueurs en chiffres. Elle ne valide pas les numéros du monde entier, ne vérifie pas qu’un numéro est attribué et n’est pas équivalente à PhoneNumberField. Conservez-la uniquement si ces restrictions correspondent aux numéros acceptés par votre application ; sinon, préférez l’approche avec le package ou définissez un validateur adapté aux besoins réels de l’application.

E.164 autorise au maximum 15 chiffres ; le signe + placé en tête dans sa représentation internationale est un caractère distinct. Un champ max_length=16 peut contenir cette représentation, mais cette limite de longueur ne suffit pas à appliquer la syntaxe E.164 ni les règles de numérotation propres à chaque pays. Un validateur doit vérifier le préfixe autorisé et le nombre de chiffres ; une validation internationale plus complète nécessite les métadonnées du plan de numérotation. Pour chacun des deux champs de modèle, déterminez selon votre modèle de données si les numéros doivent être uniques et si le champ peut être vide ou nul.