Was ist der beste Weg, um eine Telefonnummer in Django-Modellen zu speichern?

Lesezeit: 6 Minuten

Benutzeravatar von pynovice
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.

  1. 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
    
  2. 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.

    – Maxime R.

    24. Juni 2016 um 15:10 Uhr

Benutzeravatar von rgenito
rgenito

Verwenden Django-Telefonnummer-Feld:

pip install django-phonenumber-field

  • 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

Benutzeravatar von nicorellius
nikorellius

Verwenden ein CharField für das Telefonfeld im Modell und die localflavor App zur Formularvalidierung:

https://docs.djangoproject.com/en/1.7/topics/localflavor/

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

Benutzeravatar von VMMF
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:

Telefon im Formular

Benutzeravatar von U2EF1
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.

Benutzeravatar von GoPackGo90
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.

Benutzeravatar von ProgrammerZzzz123
ProgrammiererZzzz123

Zuerst installieren Paket “django-phonenumber-field”. mit dem folgenden Befehl:

pip install django-phonenumber-field[phonenumbers]

Dann einstellen “Telefonnummer_Feld” zu INSTALLED_APPS in “settings.py”:

# "settings.py"

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

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

Führen Sie dann den folgenden Befehl aus:

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

Nun wird das Feld für eine Telefonnummer wie unten gezeigt erstellt:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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"

1430260cookie-checkWas ist der beste Weg, um eine Telefonnummer in Django-Modellen zu speichern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy