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.
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.
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
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
Utilisez Django-phonenumber-field: https://github.com/stefanfoulis/Django-phonenumber-field
pip install Django-phonenumber-field
Utilisez CharField
pour le champ de téléphone dans le modèle et l'application localflavor
pour la validation de formulaire:
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.
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.
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.
Utilisez Django-phonenumber-field pour la validation: https://github.com/stefanfoulis/Django-phonenumber-field
pip install Django-phonenumber-field
pip install phonenumbers