web-dev-qa-db-fra.com

Quelle est la meilleure façon de stocker un numéro de téléphone dans des 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 entrerait un numéro de téléphone et j'utiliserais le numéro de téléphone pour SMS Authentication Cette application serait utilisée globalement. Donc, j'aurais aussi besoin d'un code de pays. Est-ce que CharField est un bon moyen de stocker un numéro de téléphone? Et comment valider le numéro de téléphone?

Merci d'avance.

112
pynovice

Vous pourriez en fait examiner le format normalisé internationalement E.164 , recommandé par Twilio par exemple (disposant d'un service et d'une API pour l'envoi de SMS ou appels téléphoniques via REST requêtes).

C’est probablement le moyen le plus universel de stocker des numéros de téléphone, en particulier si vous utilisez des numéros internationaux.

1. Téléphone par PhoneNumberField

Vous pouvez utiliser la bibliothèque phonenumber_field. Il s'agit du port de la bibliothèque Google libphonenumber, qui alimente la gestion des numéros de téléphone d'Android https://github.com/stefanfoulis/Django-phonenumber-field

Dans le modèle:

from phonenumber_field.modelfields import PhoneNumberField

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

Informer:

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

Obtenir le téléphone sous forme de chaîne à partir du champ d'objet:

    client.phone.as_e164 

Normoliser la chaîne téléphonique (pour les tests et 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 expression rationnelle

Une note 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, puis essayer de contacter le numéro immédiatement pour vérifier.

Je pense avoir utilisé quelque chose comme ceci sur 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 allowed."))

EDIT

Il semble que ce message ait été utile à certaines personnes, et il semble utile d’intégrer le commentaire ci-dessous dans une réponse plus complète. Conformément à jpotter6 , vous pouvez également effectuer les opérations suivantes sur vos modèles:

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
244
erewok

Utilisez Django-phonenumber-field: https://github.com/stefanfoulis/Django-phonenumber-field

pip install Django-phonenumber-field
45
rgenito

Utilisez CharField pour le champ de téléphone dans le modèle et l'application localflavor pour la validation de formulaire:

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

6
nicorellius

La validation est facile, envoyez-leur un texte avec un peu de code. Un CharField est un excellent moyen de le stocker. Je ne m'inquiéterais pas trop de la canonisation des numéros de téléphone.

2
U2EF1

Tout dépend de ce que vous comprenez comme numéro de téléphone. Les numéros de téléphone sont spécifiques à chaque pays. Les paquets localflavors de plusieurs pays contiennent leur propre "champ de numéro de téléphone". Donc, si vous êtes d'accord avec votre pays, vous devriez jeter un coup d'œil au paquet localflavor (class us.models.PhoneNumberField pour le cas américain, etc.)

Sinon, vous pouvez inspecter les saveurs locales pour obtenir la longueur maximale pour tous les pays. Localflavor propose également des champs de formulaire que vous pouvez utiliser conjointement avec le code de pays pour valider le numéro de téléphone.

1
esauro

Je vais décrire ce que j'utilise:

Validation: la chaîne contient plus de 5 chiffres.

Nettoyage: supprimer tous les symboles non numériques, écrire en chiffres uniquement. J'ai de la chance, car dans mon pays (Russie), tout le monde a un numéro de téléphone à 10 chiffres. Donc, je ne stocke en db que 10 diits. Si vous écrivez une application multi-pays, alors vous devriez faire une validation complète.

Rendu: J'écris une balise de gabarit personnalisée pour la rendre correctement dans un gabarit. Ou même le rendre comme une image - il est plus sûr d'éviter le spam par sms.

1

Utilisez Django-phonenumber-field pour la validation: https://github.com/stefanfoulis/Django-phonenumber-field

pip install Django-phonenumber-field
pip install phonenumbers
0
surya bista