Numer telefonu przechowuję w model
następujący sposób:
phone_number = models.CharField(max_length=12)
Użytkownik wprowadziłby numer telefonu, a ja użyłbym numeru telefonu dla SMS Authentication
Ta aplikacja byłaby używana globalnie. Więc potrzebowałbym również kodu kraju. Czy CharField
to dobry sposób na przechowywanie numeru telefonu? Jak zweryfikować numer telefonu?
django
django-forms
django-validation
pynovice
źródło
źródło
Odpowiedzi:
W rzeczywistości możesz zajrzeć do znormalizowanego na całym świecie formatu E.164 , zalecanego na przykład przez Twilio (którzy mają usługę i interfejs API do wysyłania wiadomości SMS lub połączeń telefonicznych za pośrednictwem żądań REST).
Jest to prawdopodobnie najbardziej uniwersalny sposób przechowywania numerów telefonów, zwłaszcza jeśli masz numery międzynarodowe.
1. Telefon przez PhoneNumberField
Możesz skorzystać z
phonenumber_field
biblioteki. Jest to port biblioteki Google libphonenumber, która obsługuje obsługę numerów telefonów Androida https://github.com/stefanfoulis/django-phonenumber-fieldW modelu:
Formalnie:
Pobierz telefon jako ciąg z pola obiektu:
Normolize string phone (do testów i innych pracowników):
2. Telefon przez regexp
Jedna uwaga dotycząca twojego modelu: numery E.164 mają maksymalną długość 15 znaków.
Aby to sprawdzić, możesz zastosować kombinację formatowania, a następnie spróbować natychmiast skontaktować się z numerem w celu weryfikacji.
Wydaje mi się, że w moim projekcie django użyłem czegoś takiego:
EDYTOWAĆ
Wygląda na to, że ten post był przydatny dla niektórych osób i wydaje się, że warto włączyć poniższy komentarz do pełniejszej odpowiedzi. Zgodnie z jpotter6 , możesz również wykonać na swoich modelach coś takiego:
models.py:
źródło
'^\+\d{8,15}$'
a następniemax_length=16
dlaCharField
.Użyj pola django-phonenumber-field: https://github.com/stefanfoulis/django-phonenumber-field
źródło
PHONENUMBER_DEFAULT_REGION = 'US'
tych ustawień nie będzie można wprowadzić niczego, co użytkownicy ze Stanów Zjednoczonych rozpoznaliby jako numer telefonu. Nawet wtedy ten pakiet nie zostanie wyświetlony jako coś, co wygląda jak numer telefonu. . . Jestem pewien, że istnieje ustawienie, którego jeszcze nie znalazłem!pip install django-phone-field
pip install django-phonenumber-field[phonenumberslite]
która nie zawiera metadanych geokodowania, nośnika i strefy czasowejUżyj
CharField
dla pola telefonu w modelu ilocalflavor
aplikacji do walidacji formularza:https://docs.djangoproject.com/en/1.7/topics/localflavor/
źródło
Walidacja jest łatwa, napisz im mały kod do wpisania. CharField to świetny sposób na jego przechowywanie. Nie martwiłbym się zbytnio kanonizacją numerów telefonów.
źródło
Wszystko zależy od tego, co rozumiesz jako numer telefonu. Numery telefonów zależą od kraju. Pakiety lokalnych smaków dla kilku krajów zawierają własne „pole numeru telefonu”. Więc jeśli nie przeszkadza ci, jeśli chodzi o określony kraj, powinieneś spojrzeć na pakiet lokalnych smaków (
class us.models.PhoneNumberField
w przypadku USA itp.)W przeciwnym razie możesz sprawdzić lokalne smaki, aby uzyskać maksymalną długość dla wszystkich krajów. Localflavor ma również pola formularzy, których możesz użyć w połączeniu z kodem kraju, aby zweryfikować numer telefonu.
źródło
Opiszę czego używam:
Walidacja: ciąg zawiera więcej niż 5 cyfr.
Czyszczenie: usuwanie wszystkich symboli innych niż cyfry, wpisywanie tylko liczb w db. Mam szczęście, bo w moim kraju (Rosja) każdy ma 10-cyfrowe numery telefonów. Więc przechowuję w db tylko 10 diits. Jeśli piszesz wniosek obejmujący wiele krajów, powinieneś dokonać kompleksowej weryfikacji.
Renderowanie: piszę niestandardowy tag szablonu, aby ładnie renderować go w szablonie. Lub nawet wyrenderuj go jak obrazek - bezpieczniej jest zapobiegać spamowaniu przez sms.
źródło
Inni wspomnieli
django-phonenumber-field
. Aby uzyskać format wyświetlania jak chcesz trzeba ustawićPHONENUMBER_DEFAULT_FORMAT
ustawienia do"E164"
,"INTERNATIONAL"
,"NATIONAL"
, lub"RFC3966"
, jednak chcesz to wyświetlany. Zobacz źródło GitHub .źródło