Ich speichere eine Telefonnummer model
wie folgt:
phone_number = models.CharField(max_length=12)
Der Benutzer würde eine Telefonnummer eingeben und ich würde die Telefonnummer für verwenden. SMS Authentication
Diese Anwendung würde global verwendet. Also würde ich auch Ländercode brauchen. Ist CharField
eine gute Möglichkeit, Telefonnummer zu speichern? Und wie überprüfe ich die Telefonnummer?
django
django-forms
django-validation
pynovice
quelle
quelle
Antworten:
Sie aussehen könnten tatsächlich in das international genormte Format E.164 , von Twilio zum Beispiel empfohlen (die für das Senden von SMS oder Telefon-Anrufen über REST - Anfragen einen Service und eine API).
Dies ist wahrscheinlich die universellste Methode zum Speichern von Telefonnummern, insbesondere wenn Sie mit internationalen Nummern arbeiten.
1. Telefon von PhoneNumberField
Sie können die
phonenumber_field
Bibliothek verwenden. Es ist der Port der libphonenumber-Bibliothek von Google, die die Handhabung der Telefonnummer von Android unter https://github.com/stefanfoulis/django-phonenumber-field unterstütztIm Modell:
Informieren:
Holen Sie sich das Telefon als Zeichenfolge aus dem Objektfeld:
Telefonschnur normieren (für Tests und anderes Personal):
2. Telefon per Regexp
Ein Hinweis für Ihr Modell: E.164-Zahlen haben eine maximale Zeichenlänge von 15.
Zur Validierung können Sie eine Kombination aus Formatierung und anschließendem Versuch verwenden, die Nummer sofort zu kontaktieren, um dies zu überprüfen.
Ich glaube, ich habe in meinem Django-Projekt Folgendes verwendet:
BEARBEITEN
Es scheint, dass dieser Beitrag für einige Leute nützlich war, und es scheint sich zu lohnen, den folgenden Kommentar in eine umfassendere Antwort zu integrieren. Wie pro jpotter6 , können Sie so etwas wie die folgenden auf Ihre Modelle auch tun:
models.py:
quelle
'^\+\d{8,15}$'
und dannmax_length=16
für dieCharField
.Verwenden Sie das Django-Telefonnummernfeld: https://github.com/stefanfoulis/django-phonenumber-field
quelle
PHONENUMBER_DEFAULT_REGION = 'US'
in den Einstellungen können Sie nichts eingeben, was Benutzer aus den USA als Telefonnummer erkennen würden. Selbst dann wird dieses Paket nicht als etwas ausgegeben, das wie eine Telefonnummer aussieht. . . Ich bin sicher, es gibt eine Einstellung, die ich noch nicht gefunden habe!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
die die Metadaten für Geokodierung, Träger und Zeitzone nicht enthältVerwendung
CharField
für das Telefonfeld im Modell und dielocalflavor
App für die Formularvalidierung:https://docs.djangoproject.com/de/1.7/topics/localflavor/
quelle
Die Validierung ist einfach. Schreiben Sie ihnen einen kleinen Code zum Eingeben. Ein CharField ist eine großartige Möglichkeit, ihn zu speichern. Ich würde mir keine Sorgen um die Kanonisierung von Telefonnummern machen.
quelle
Es hängt alles davon ab, was Sie als Telefonnummer verstehen. Telefonnummern sind länderspezifisch. Die localflavors-Pakete für mehrere Länder enthalten ein eigenes "Telefonnummernfeld". Wenn Sie also in der Lage sind, länderspezifisch zu sein, sollten Sie sich das Paket localflavor ansehen (
class us.models.PhoneNumberField
für US-Fälle usw.).Andernfalls könnten Sie die lokalen Aromen überprüfen, um die maximale Länge für alle Länder zu erhalten. Localflavor verfügt auch über Formularfelder, die Sie in Verbindung mit der Landesvorwahl zur Überprüfung der Telefonnummer verwenden können.
quelle
Ich werde beschreiben, was ich benutze:
Validierung: Zeichenfolge enthält mehr als 5 Ziffern.
Reinigung: Entfernen Sie alle nicht-stelligen Symbole. Schreiben Sie nur DB-Zahlen. Ich habe Glück, denn in meinem Land (Russland) hat jeder eine 10-stellige Telefonnummer. Also speichere ich in db nur 10 diits. Wenn Sie einen Antrag für mehrere Länder schreiben, sollten Sie eine umfassende Validierung durchführen.
Rendern: Ich schreibe ein benutzerdefiniertes Vorlagen-Tag, um es in der Vorlage schön zu rendern. Oder rendern Sie es sogar wie ein Bild - es ist sicherer, SMS-Spam zu verhindern.
quelle
Andere erwähnten
django-phonenumber-field
. Um das Anzeigeformat zu erhalten , wie Sie wollen , Sie brauchen , um Set -PHONENUMBER_DEFAULT_FORMAT
Einstellung"E164"
,"INTERNATIONAL"
,"NATIONAL"
, oder"RFC3966"
, wie Sie wollen es angezeigt. Siehe die GitHub-Quelle .quelle