211 votes

Quelle est la meilleure façon de stocker un numéro de téléphone dans les modèles Django ?

Je stocke un numéro de téléphone dans model comme ceci :

phone_number = models.CharField(max_length=12)

L'utilisateur saisit un numéro de téléphone et j'utilise ce numéro de téléphone pour Authentification par SMS . Cette application sera utilisée dans le monde entier. J'aurais donc également besoin d'un code pays. Est-ce que CharField une bonne façon de stocker un numéro de téléphone ? Et comment valider le numéro de téléphone ?

406voto

erewok Points 1577

Vous pourriez en fait vous pencher sur le format normalisé au niveau international E.164 , recommandé par Twilio par exemple (qui dispose d'un service et d'une API pour l'envoi de SMS ou d'appels téléphoniques via des requêtes REST).

Il s'agit probablement de la méthode la plus universelle pour stocker les numéros de téléphone, en particulier si vous travaillez avec des numéros internationaux.

  1. Téléphone par PhoneNumberField

    Vous pouvez utiliser le phonenumber_field bibliothèque. Il s'agit d'un portage de la bibliothèque libphonenumber de Google, qui gère les numéros de téléphone sous Android. Voir aussi django-numéro de téléphone .

    Dans le modèle :

    from phonenumber_field.modelfields import PhoneNumberField
    
    class Client(models.Model, Importable):
        phone = PhoneNumberField(null=False, blank=False, unique=True)

    Dans le formulaire :

    from phonenumber_field.formfields import PhoneNumberField
    class ClientForm(forms.Form):
        phone = PhoneNumberField()

    Obtenir le téléphone sous forme de chaîne de caractères à partir d'un champ d'objet :

    client.phone.as_e164

    Normaliser la chaîne téléphonique (pour les tests et les autres membres du personnel) :

    from phonenumber_field.phonenumber import PhoneNumber
    phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
  2. Téléphone par regexp

    Une remarque pour votre modèle : Les numéros E.164 ont une longueur maximale de 15 caractères.

    Pour valider, vous pouvez utiliser une combinaison de formatage et tenter de contacter le numéro immédiatement pour vérifier.

    Je crois que j'ai utilisé quelque chose comme ceci dans mon projet 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 is allowed."))

Conformément à la jpotter6 Vous pouvez également faire quelque chose comme ce qui suit dans vos modèles :

Fichier 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

65voto

rgenito Points 498

Utilice django-numéro de téléphone :

pip install django-phonenumber-field

9voto

nicorellius Points 357

Utiliser un CharField pour le champ téléphone dans le modèle et le champ localflavor pour la validation des formulaires :

https://docs.djangoproject.com/en/1.7/topics/localflavor/

Au 2021-12-07, il semble que Saveur locale ne fait plus partie de Django.

8voto

U2EF1 Points 3230

La validation est facile. Envoyez-leur un petit code à saisir.

Un champ CharField est un excellent moyen de les stocker. Je ne m'inquiéterais pas trop de la canonisation des numéros de téléphone.

8voto

VMMF Points 371

Cette solution a fonctionné pour moi :

Première installation django-phone-field . Commandement :

pip install django-phone-field

Ensuite, dans le fichier models.py :

from phone_field import PhoneField
...

class Client(models.Model):
    ...
    phone_number = PhoneField(blank=True, help_text='Contact phone number')

Et dans le dossier settings.py :

INSTALLED_APPS = [...,
                  'phone_field'
]

En fin de compte, le résultat est le suivant :

Phone in form

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X