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 ?

8voto

Installez d'abord Paquet "django-phonenumber-field". avec la commande ci-dessous :

pip install django-phonenumber-field[phonenumbers]

Ensuite, définissez "phonenumber_field" (champ du numéro de téléphone) a INSTALLED_APPS en "settings.py" :

# "settings.py"

INSTALLED_APPS = [
    ...
    "phonenumber_field",
    ...
]

Ensuite, définissez un champ avec "PhoneNumberField()" en "models.py" :

# "models.py"

from django.db import models
from phonenumber_field.modelfields import PhoneNumberField

class Contact(models.Model):
    phone = PhoneNumberField()

Ensuite, enregistrez-vous "Contact" en "admin.py" :

# "admin.py"

from django.contrib import admin
from .models import Contact

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    pass

Ensuite, exécutez la commande ci-dessous :

python manage.py makemigrations && python manage.py migrate

Le champ pour un numéro de téléphone est maintenant créé comme indiqué ci-dessous :

enter image description here

En outre, assigner le widget "PhoneNumberPrefixWidget()" au champ dans un formulaire personnalisé et assigner le formulaire personnalisé à l'administrateur comme indiqué ci-dessous :

# "admin.py"

from django.contrib import admin
from .models import Contact
from django import forms
from phonenumber_field.widgets import PhoneNumberPrefixWidget

class ContactForm(forms.ModelForm):
    class Meta:
        widgets = {
            'phone': PhoneNumberPrefixWidget(),
        }

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    form = ContactForm

Maintenant, avec les codes de pays, le champ pour un numéro de téléphone est créé

enter image description here

De plus, vous pouvez définir un code pays initial comme initial='US' a "PhoneNumberPrefixWidget()" comme indiqué ci-dessous. *Le code pays initial doit être en majuscules :

# "admin.py"

from django.contrib import admin
from .models import Contact
from django import forms
from phonenumber_field.widgets import PhoneNumberPrefixWidget

class ContactForm(forms.ModelForm):
    class Meta:
        widgets = {                          # Here
            'phone': PhoneNumberPrefixWidget(initial='US'),
        }

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    form = ContactForm

Aujourd'hui, avec le code pays initial "US" sélectionné Le champ d'un numéro de téléphone est créé :

enter image description here

Vous pouvez également définir un code pays initial avec "NUMÉRO DE TÉLÉPHONE_RÉGION_PAR_DÉFAUT" en "settings.py" comme indiqué ci-dessous, mais je recommande de définir un code pays initial avec initial='US' a "PhoneNumberPrefixWidget()" comme je l'ai fait ci-dessus, car l'utilisation de "NUMÉRO DE TÉLÉPHONE_RÉGION_PAR_DÉFAUT" Il arrive parfois que les numéros de téléphone enregistrés ne s'affichent pas dans Administrateur Django :

# "settings.py"

PHONENUMBER_DEFAULT_REGION = "US"

3voto

GoPackGo90 Points 41

D'autres ont mentionné django-phonenumber-field . Pour obtenir le format d'affichage souhaité, vous devez définir les paramètres suivants PHONENUMBER_DEFAULT_FORMAT réglage à "E164" , "INTERNATIONAL" , "NATIONAL" ou "RFC3966" , de la manière dont vous souhaitez qu'il soit affiché. Voir l'article Source GitHub .

1voto

esauro Points 1278

Tout dépend de ce que vous entendez par numéro de téléphone. Les numéros de téléphone sont spécifiques à chaque pays. Les paquets de saveurs locales pour plusieurs pays contiennent leur propre "champ de numéro de téléphone". Donc, si vous êtes d'accord avec le fait d'être spécifique à un pays, vous devriez jeter un coup d'œil au paquet localflavor ( class us.models.PhoneNumberField pour le cas des États-Unis, etc.)

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

1voto

Je vais décrire ce que j'utilise :

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

Nettoyage : suppression de tous les symboles autres que les chiffres et écriture des seuls chiffres dans la base de données. J'ai de la chance, car dans mon pays (la Russie), tout le monde a des numéros de téléphone à 10 chiffres. Je ne stocke donc que 10 chiffres dans la base de données. Si vous écrivez une application multi-pays, vous devez procéder à une validation complète.

Rendu : J'écris une balise de gabarit personnalisée pour effectuer un bon rendu dans le gabarit. Ou même le rendre comme une image - c'est plus sûr pour éviter le spam par SMS.

1voto

Cynthia Benson Points 11

Tout d'abord, vous devez installer le paquetage Django pour les numéros de téléphone.

pip install django-phonenumber-field[phonenumbers]

Il faut ensuite l'ajouter aux applications installées :

INSTALLED_APPS = [
    ...
    'phonenumber_field',
    ...
]

Voici comment l'utiliser dans votre modèle :

from phonenumber_field.modelfields import PhoneNumberField

class Artist(models.Model):

    phone_number = PhoneNumberField()

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