Was ist der beste Weg, um eine Telefonnummer in Django-Modellen zu speichern?
Lesezeit: 6 Minuten
Pynowitz
Ich speichere eine Telefonnummer in model so was:
phone_number = models.CharField(max_length=12)
Der Benutzer würde eine Telefonnummer eingeben und ich würde die Telefonnummer für verwenden SMS-Authentifizierung. Diese Anwendung würde weltweit verwendet werden. Also bräuchte ich auch eine Ländervorwahl. Ist CharField eine gute Möglichkeit, eine Telefonnummer zu speichern? Und wie validiere ich die Telefonnummer?
Hier ist ein großartiger Vorschlag: stackoverflow.com/a/1245990/207791
– Viktor Sergijenko
5. August 2015 um 13:21 Uhr
Sie könnten sich tatsächlich das international standardisierte Format ansehen E.164, empfohlen von Twilio zum Beispiel (die einen Dienst und eine API zum Senden von SMS oder Telefonanrufen über REST-Anforderungen haben).
Dies dürfte die universellste Möglichkeit sein, Telefonnummern zu speichern, insbesondere wenn Sie mit internationalen Rufnummern arbeiten.
Telefon nach PhoneNumberField
Du kannst den … benutzen phonenumber_field Bibliothek. Es ist eine Portierung der libphonenumber-Bibliothek von Google, die die Handhabung von Android-Telefonnummern unterstützt. Sehen Django-Telefonnummer-Feld.
Im Modell:
from phonenumber_field.modelfields import PhoneNumberField
class Client(models.Model, Importable):
phone = PhoneNumberField(null=False, blank=False, unique=True)
In der Form:
from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
phone = PhoneNumberField()
Rufen Sie das Telefon als Zeichenfolge aus einem Objektfeld ab:
client.phone.as_e164
Normalisieren Sie die Telefonzeichenfolge (für Tests und andere Mitarbeiter):
from phonenumber_field.phonenumber import PhoneNumber
phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164
Telefon durch Regexp
Ein Hinweis für Ihr Modell: E.164-Nummern haben eine maximale Zeichenlänge von 15.
Zur Validierung können Sie eine Kombination aus Formatierung verwenden und dann versuchen, die Nummer sofort zur Bestätigung zu kontaktieren.
Ich glaube, ich habe in meinem Django-Projekt so etwas wie das Folgende 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 is allowed."))
Gemäß jpotter6 können Sie in Ihren Modellen auch Folgendes tun:
Datei 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
Es könnte hilfreich sein, dies auch an einem Modell zu zeigen. phone_regex = RegexValidator(regex=r’^\+?1?\d{9,15}$’, message=”Telefonnummer muss im Format: ‘+999999999’ eingegeben werden. Bis zu 15 Ziffern erlaubt.”) phone_number = models.CharField(validators=phone_regex, blank=True)
– jpotts18
23. April 2014 um 16:23 Uhr
Vergessen Sie nicht, „max_length=15“ zu „models.CharField“ hinzuzufügen
– Esteban
23. Januar 2015 um 2:41 Uhr
@Esteban – max_length=16 (es gibt ein optionales + am Anfang)
– Dhackner
3. Februar 2015 um 0:55 Uhr
@erewok – Ich glaube nicht, dass Sie die ‘1’ in Ihrer Regex wollen. E.164 erlaubt bis zu 15 Ziffern, einschließlich der Ländervorwahl.
– Dhackner
3. Februar 2015 um 0:56 Uhr
Tatsächlich enthält E.164 keine internationalen Anrufpräfixe, nur die Ländervorwahl gefolgt von der eigentlichen Nummer, außerdem scheint die Mindestlänge einer E.164-Nummer 8 zu sein, also sollte die Regex so sein '^\+\d{8,15}$' und dann max_length=16 für die CharField.
Vergessen Sie nicht, die Region hinzuzufügen. Ohne 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 nur noch nicht gefunden habe!
– Drigan
16. März 2018 um 22:52 Uhr
Hinweis: Dieses Paket ist sehr groß. Über 40 MB. 33 MB davon sind Geodaten.
– Vordenker
18. September 2018 um 1:21 Uhr
Unter Berücksichtigung des Kommentars von @Forethinker ist eine viel leichtere Alternative github.com/VeryApt/django-phone-field über pip install django-phone-field
– SMX
15. Oktober 2018 um 22:19 Uhr
@Forethinker dann können wir die “Lite” -Version verwenden pip install django-phonenumber-field[phonenumberslite] die Geokodierung, Netzbetreiber und Zeitzonen-Metadaten nicht enthalten
– hey
26. April 2020 um 14:37 Uhr
nikorellius
Verwenden ein CharField für das Telefonfeld im Modell und die localflavor App zur Formularvalidierung:
Ab dem 07.12.2021 sieht es so aus Lokaler Geschmack ist nicht mehr Teil von Django.
Ich stimme @rgenito jetzt zu (für Django 3.x), und ich verwende derzeit die django-phonenumber-field (mit phonenumbers).
– Nikorellius
31. Januar 2021 um 4:52 Uhr
die Verbindung ist unterbrochen.
– cdrrr
27. November 2021 um 10:57 Uhr
VMMF
Diese Lösung hat bei mir funktioniert:
Zuerst installieren Django-Telefonfeld. Befehl:
pip install django-phone-field
Dann in Datei Modelle.py:
from phone_field import PhoneField
...
class Client(models.Model):
...
phone_number = PhoneField(blank=True, help_text="Contact phone number")
Und in Datei settings.py:
INSTALLED_APPS = [...,
'phone_field'
]
Das sieht am Ende so aus:
U2EF1
Die Validierung ist einfach. Schicke ihnen einen kleinen Code zum Eintippen.
Ein CharField ist eine großartige Möglichkeit, es zu speichern. Ich würde mir nicht allzu viele Gedanken über die Kanonisierung von Telefonnummern machen.
GoPackGo90
Andere erwähnt django-phonenumber-field. Um das gewünschte Anzeigeformat zu erhalten, müssen Sie es einstellen PHONENUMBER_DEFAULT_FORMAT Einstellung zu "E164", "INTERNATIONAL", "NATIONAL"oder "RFC3966", wie Sie es angezeigt haben möchten. Siehe die GitHub-Quelle.
ProgrammiererZzzz123
Zuerst installieren Paket “django-phonenumber-field”. mit dem folgenden Befehl:
Legen Sie dann mit ein Feld fest “TelefonnummerFeld()” in “models.py”:
# "models.py"
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
class Contact(models.Model):
phone = PhoneNumberField()
Dann registrieren Sie sich “Kontakt” in “admin.py”:
# "admin.py"
from django.contrib import admin
from .models import Contact
@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
pass
Nun wird das Feld für eine Telefonnummer wie unten gezeigt erstellt:
Außerdem zuordnen das Widget “PhoneNumberPrefixWidget()” dem Feld in einem benutzerdefinierten Formular hinzufügen und das benutzerdefinierte Formular wie unten gezeigt dem Administrator zuweisen:
# "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
Jetzt wird mit Ländercodes das Feld für eine Telefonnummer erstellt
Und Sie können einen anfänglichen Ländercode wie festlegen initial=”US” zu “PhoneNumberPrefixWidget()” Wie nachfolgend dargestellt. *Anfänglicher Ländercode muss in Großbuchstaben geschrieben werden:
# "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
Jetzt mit der anfängliche Ländercode “US” ausgewähltwird das Feld für eine Telefonnummer erstellt:
Sie können auch mit einen anfänglichen Ländercode einstellen “PHONENUMBER_DEFAULT_REGION” in “settings.py” wie unten gezeigt, aber ich empfehle, einen anfänglichen Ländercode mit einzustellen initial=”US” zu “PhoneNumberPrefixWidget()” wie ich es oben getan habe, weil mit “PHONENUMBER_DEFAULT_REGION” zeigt gespeicherte Telefonnummern manchmal nicht an Django-Admin:
# "settings.py"
PHONENUMBER_DEFAULT_REGION = "US"
14302600cookie-checkWas ist der beste Weg, um eine Telefonnummer in Django-Modellen zu speichern?yes
Hier ist ein großartiger Vorschlag: stackoverflow.com/a/1245990/207791
– Viktor Sergijenko
5. August 2015 um 13:21 Uhr