Django 모델에 전화 번호를 저장하는 가장 좋은 방법은 무엇입니까


131

전화 번호를 다음 model과 같이 저장하고 있습니다 .

phone_number = models.CharField(max_length=12)

사용자는 전화 번호를 입력 SMS Authentication하고이 응용 프로그램은 전 세계적으로 사용됩니다. 국가 코드도 필요합니다. 가 CharField전화 번호를 저장할 수있는 좋은 방법은? 전화 번호는 어떻게 확인합니까?


1
여기에 좋은 제안이 있습니다. stackoverflow.com/a/1245990/207791
Victor Sergienko

답변:


283

당신은 실제로 국제적으로 표준화 된 형식으로 보일 수 있습니다 E.164 , 예를 들어 Twilio 추천 (서비스 및 REST 요청을 통해 SMS 또는 전화 통화를 보내기위한 API를).

특히 국제 전화 번호를 사용하는 경우 전화 번호를 저장하는 가장 보편적 인 방법 일 수 있습니다.

1. PhoneNumberField로 전화

phonenumber_field라이브러리 를 사용할 수 있습니다 . Google의 libphonenumber 라이브러리 포트이며 Android 전화 번호 처리 기능을 제공합니다. https://github.com/stefanfoulis/django-phonenumber-field

모델에서 :

from phonenumber_field.modelfields import PhoneNumberField

class Client(models.Model, Importable):
    phone = PhoneNumberField(null=False, blank=False, unique=True)

형태로 :

from phonenumber_field.formfields import PhoneNumberField
class ClientForm(forms.Form):
    phone = PhoneNumberField()

객체 필드에서 전화를 문자열로 가져옵니다.

    client.phone.as_e164 

전화 문자열 노멀 라이즈 (테스트 및 기타 직원) :

    from phonenumber_field.phonenumber import PhoneNumber
    phone = PhoneNumber.from_string(phone_number=raw_phone, region='RU').as_e164

2. 정규식 전화

모델에 대한 참고 사항 : E.164 숫자의 최대 문자 길이는 15입니다.

유효성을 검사하기 위해 형식을 조합 한 다음 즉시 번호를 문의하여 확인할 수 있습니다.

내 장고 프로젝트에서 다음과 같은 것을 사용했다고 생각합니다.

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."))

편집하다

이 게시물은 일부 사람들에게 유용한 것으로 보이며 아래 주석을보다 완전한 답변으로 통합하는 것이 좋습니다. 당 jpotter6 , 당신은뿐만 아니라 당신의 모델에서 다음과 같은 작업을 수행 할 수 있습니다 :

models.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

19
모델에서이 작업을 수행하는 방법도 보여주는 것이 좋습니다. phone_regex = RegexValidator (regex = r '^ \ +? 1? \ d {9,15} $', message = "전화 번호는 '+999999999'형식으로 입력해야합니다. 최대 15 자리까지 허용됩니다.") phone_number = models.CharField (검증 = phone_regex, 빈 = 참)
jpotts18

12
모델에 'max_length = 15'를 추가하는 것을 잊지 마십시오. CharField
Esteban

4
@Esteban-max_length = 16 (시작에 옵션 +가 있습니다)
dhackner

3
@erewok-정규식에서 '1'을 원한다고 생각하지 않습니다. E.164는 국가 코드를 포함하여 최대 15 자리를 허용합니다.
dhackner

1
실제로 E.164는 국제 전화 접두사를 포함하지 않으며 국가 코드와 실제 번호가 뒤 따르고 E.164 번호최소 길이는 8 인 것처럼 보이 므로 정규식은 다음 '^\+\d{8,15}$'과 같아야 max_length=16합니다 CharField.
Maxime R.

48

django-phonenumber-field 사용 : https://github.com/stefanfoulis/django-phonenumber-field

pip install django-phonenumber-field

1
지역을 추가하는 것을 잊지 마십시오. PHONENUMBER_DEFAULT_REGION = 'US'설정이 없으면 미국 사용자가 전화 번호로 인식 할 수있는 항목을 입력 할 수 없습니다. 그럼에도 불구하고이 패키지는 전화 번호처럼 보이는 것으로 출력되지 않습니다. . . 방금 아직 찾지 못한 설정이 있습니다.
Drigan

7
참고 :이 패키지는 매우 큽니다. 40MB 이상 33MB는 지리 데이터입니다.
Forethinker

1
@Forethinker의 의견을 지적하면 훨씬 가벼운 대안은 github.com/VeryApt/django-phone-field입니다 .pip install django-phone-field
SMX

@Forethinker pip install django-phonenumber-field[phonenumberslite]는 지오 코딩, 이동 통신사 및 시간대 메타 데이터를 포함하지 않는 "lite"버전 을 사용할 수 있습니다
heyjr


3

유효성 검사는 쉽습니다. 입력 할 코드를 약간 문자로 입력하십시오. CharField는이를 저장하는 좋은 방법입니다. 나는 전화 번호를 정규화하는 것에 대해 너무 걱정하지 않을 것입니다.


1

그것은 모두 전화 번호로 이해하는 것에 달려 있습니다. 전화 번호는 국가별로 다릅니다. 여러 국가의 localflavors 패키지에는 자체 "전화 번호 필드"가 포함되어 있습니다. 따라서 국가별로 괜찮다면 localflavor 패키지 (class us.models.PhoneNumberField 미국의 경우 등)를 .

그렇지 않으면 모든 국가의 최대 길이를 얻기 위해 현지 향료를 검사 할 수 있습니다. Localflavor에는 전화 번호를 확인하기 위해 국가 코드와 함께 사용할 수있는 양식 필드도 있습니다.


흠, 나는 조사하는 동안 발견했다. 양식에서 사용하는 방법에 대한 예를들 수 있습니까?
pynovice

1

내가 사용하는 것을 설명 할 것이다 :

유효성 검사 : 문자열에 5 자리가 넘는 숫자가 포함되어 있습니다.

청소 : 숫자가 아닌 모든 기호를 제거하고 db 만 숫자로 작성하십시오. 우리 나라 (러시아)에는 모두 10 자리 숫자의 전화 번호가 있기 때문에 운이 좋았습니다. 그래서 나는 db에 10 diit 만 저장합니다. 다 국가 응용 프로그램을 작성하는 경우 포괄적 인 유효성 검사를 수행해야합니다.

렌더링 : 템플릿에서 멋지게 렌더링하기 위해 사용자 정의 템플릿 태그를 작성합니다. 또는 사진처럼 렌더링 할 수도 있습니다. SMS 스팸을 방지하는 것이 더 안전합니다.


0

다른 사람들은 언급했다 django-phonenumber-field. 당신은 설정에 필요한 방법을 표시 형식 얻으려면 PHONENUMBER_DEFAULT_FORMAT에 설정을 "E164", "INTERNATIONAL", "NATIONAL", 또는 "RFC3966", 그러나 당신은 그것을 표시합니다. GitHub 소스를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.