2013-10-02 12 views
71

I Telefonnummer in einem model wie dies an Speicherung:Was ist der beste Weg, Telefonnummer in Django Modellen speichern

phone_number = models.CharField(max_length=12) 

Benutzer eine Telefonnummer würde eingeben und ich würde die Telefonnummer für SMS Authentication Diese Anwendung verwenden würde global verwendet werden. Also würde ich auch Ländercode benötigen. Ist CharField eine gute Möglichkeit, die Telefonnummer zu speichern? Und, wie überprüfe ich die Telefonnummer?

Vielen Dank im Voraus

+1

Es gibt ein toller Vorschlag hier: http://stackoverflow.com/a/1245990/207791 –

Antwort

161

Sie könnten tatsächlich in das international standardisierte Format E.164, recommended by Twilio for example (die einen Dienst und eine API zum Senden von SMS oder Telefonanrufe über REST-Anforderungen haben) suchen.

Dies ist wahrscheinlich die allgemeinste Art, Telefonnummern zu speichern, insbesondere wenn Sie mit internationalen Nummern arbeiten.

Ein Hinweis für Ihr Modell: E.164-Nummern haben eine maximale Zeichenlänge von 15

Zur Validierung, können Sie eine Kombination von Formatierung verwenden und dann sofort die Nummer versucht zu kontaktieren, um zu überprüfen.

Ich glaube, ich so etwas wie die folgenden auf meinem django Projekt verwendet:

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

Es scheint, dass dieser Beitrag auf einige Leute nützlich gewesen ist, und es scheint wert Es um den Kommentar unten in eine umfassendere Antwort zu integrieren. Nach jpotter6 können Sie auch so etwas wie die folgenden auf Ihren Modellen tun:

Modelle.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 
+15

Es könnte nützlich sein, zu zeigen, wie man dies auch auf einem Modell macht. phone_regex = RegexValidator (Regex = r '^ \ +? 1? \ D {9,15} $', Nachricht = "Die Telefonnummer muss im Format: '+999999999' eingegeben werden. Bis zu 15 Ziffern zulässig. „) phone_number = models.CharField (validators = phone_regex, blank = True) – jpotts18

+0

@ jpotter6 Ihr Kommentar wäre eine große ergänzende Antwort auf diese Frage. – par

+11

Vergessen Sie nicht, 'max_length = 15' zu den Modellen hinzuzufügen.CharField – Esteban

1

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". Also, wenn Sie in der Lage sind, länderspezifisch zu sein, sollten Sie einen Blick auf localflavor Paket werfen (class us.models.PhoneNumberField für US-Fall, etc.)

Sonst könnten Sie die lokalen Flavors überprüfen, um die maximale Länge für alle Länder zu erhalten. LocalFlavor verfügt auch über Formularfelder, die Sie zusammen mit dem Ländercode zur Überprüfung der Telefonnummer verwenden können.

+0

Hm Ja, das habe ich gefunden während ich recherchiert habe. Können Sie ein Beispiel geben, wie Sie es in einem Formular verwenden können? – pynovice

1

Ich werde beschreiben, was ich benutze:

Validierung: Zeichenfolge enthält mehr als 5 Ziffern.

Reinigung: Entfernen aller nicht Ziffern Symbole, schreiben in db nur Zahlen. Ich habe Glück, denn in meinem Land (Russland) hat jeder Telefonnummer mit 10 Ziffern. Also speichere ich in db nur 10 Einheiten. Wenn Sie eine Anwendung für mehrere Länder schreiben, sollten Sie eine umfassende Validierung vornehmen.

Rendering: Ich schreibe benutzerdefinierte Vorlage Tag, um es in Vorlage schön zu machen. Oder machen Sie es sogar wie ein Bild - es ist sicherer, SMS-Spam zu verhindern.

2

Validierung ist einfach, Text sie ein wenig Code eingeben. Ein CharField ist eine gute Möglichkeit, es zu speichern. Ich würde mir keine Sorgen machen, dass ich Telefonnummern kanonisieren kann.

Verwandte Themen