HOWTO · Django

장고에 전화 번호를 저장하는 가장 좋은 방법

Django에 전화 번호를 저장하는 몇 가지 방법을 알아보세요.

이 페이지의 내용

국제 전화번호를 Django 모델에 저장하려면 지역별 전화번호 메타데이터를 바탕으로 번호를 파싱하고 유효성을 검사하는 django-phonenumber-field와 해당 패키지의 PhoneNumberField를 사용하세요. 애플리케이션이 범위가 좁고 명확히 정의된 번호 형식만 받는다면 직접 만든 Django 유효성 검사기로 충분할 수 있습니다. 어느 방법을 사용하든 전화번호는 정수가 아니라 문자열로 저장하세요. 전화번호는 식별자이므로 정수로 변환하면 앞의 더하기 기호나 0이 사라질 수 있습니다.

다음 예제를 실행해 보세요:

phone_number = "+1 415 555 0132"
print(phone_number)
print(type(phone_number).__name__)
+1 415 555 0132
str

이 예제는 전화번호를 문자열 필드에 저장해야 하는 이유를 보여줍니다. 번호를 파싱하거나 유효성을 검사하지는 않습니다. 국제 입력에 대해 이런 처리가 필요하면 아래의 패키지를 사용하세요.

타사 Django 앱의 PhoneNumberField로 전화번호 저장하기

django-phonenumber-field를 설치할 때는 기능이 더 풍부한 Python 포트를 위한 phonenumbers 추가 기능이나, 더 가벼운 메타데이터 패키지를 위한 phonenumberslite 추가 기능을 선택할 수 있습니다. 예를 들어 프로젝트 환경에서 python -m pip install "django-phonenumber-field[phonenumbers]"를 실행하세요. lite 추가 기능을 사용하려면 phonenumbers를 phonenumberslite로 바꾸면 됩니다. 두 추가 기능은 서로 대안이므로 애플리케이션에 필요한 메타데이터 범위에 맞춰 선택하세요. 프로젝트는 GitHub의 django-phonenumber-field에서 관리됩니다. 이 패키지는 Google의 libphonenumber를 Python으로 포팅한 python-phonenumbers를 사용합니다.

Django 설정의 INSTALLED_APPS에 "phonenumber_field"를 추가하세요. 그런 다음 phonenumber_field.modelfields에서 PhoneNumberField를 가져와 모델에 선언합니다. 예를 들면 phone_number = PhoneNumberField(unique=True)와 같습니다. 선택 입력으로 만들려면 phone_number = PhoneNumberField(blank=True, null=True)를 사용할 수 있습니다. 일반적으로 필요한 from django.db import models도 가져오고, 이 선언들을 모델 클래스 안에 작성하세요. 아래 내용은 Django와 패키지가 설정된 프로젝트가 필요한 프레임워크 종속 예시이며, 독립 실행할 수 있는 런타임 예제가 아닙니다.

PhoneNumberField는 문자열로 값을 저장하고 파싱, 유효성 검사, 서식 지정에 사용할 수 있는 전화번호 객체를 제공합니다. 이들은 서로 연관되어 있지만 각각 다른 작업입니다. 파싱은 지역 정보를 바탕으로 입력을 해석하고, 유효성 검사는 번호 계획 메타데이터에 따라 번호를 확인하며, 정규화는 표준 표현을 만들고, 표시 서식 지정은 사람이 읽기 좋은 형태로 보여줍니다. 사용자가 국내 형식의 번호를 입력할 수 있다면 Django 설정에서 기본 지역을 지정하세요. 지역 정보가 충분하지 않으면 이런 입력을 신뢰성 있게 해석할 수 없습니다. 기존 레코드의 값은 person.phone_number처럼 모델 인스턴스에서 가져오고, E.164 표현이 필요할 때는 as_e164 속성을 사용하세요. 설정과 필드에 관한 자세한 내용은 프로젝트 문서를, 국제 전화번호 체계에 관해서는 E.164를 참고하세요.

유효성 검사기와 Django 모델로 전화번호 저장하기

애플리케이션에서 제한된 번호 형식만 허용하고 그 규칙을 정의할 수 있다면 Django의 RegexValidator로 CharField의 유효성을 검사할 수 있습니다. 예를 들어 django.core.validators에서 RegexValidator를 가져오고, phone_number_validator = RegexValidator(regex=r"^\+?1?\d{8,15}$")를 정의한 다음, 모델 필드에 phone_number = models.CharField(max_length=16, validators=[phone_number_validator], unique=True)처럼 전달하세요. django.db에서 models를 가져오는 모델 클래스 안에 이 선언들을 작성하면 됩니다. 이 예시는 Django에 의존하며 독립 실행 예제로 실행한 적은 없습니다.

이 정규식은 미국 국가 번호를 선택적으로 허용하고 자릿수 범위를 제한하는 좁은 패턴입니다. 전 세계 전화번호의 유효성을 검사하지 않으며, 해당 번호가 실제로 할당되었는지도 확인하지 않습니다. 또한 PhoneNumberField와 같은 기능을 제공하지 않습니다. 애플리케이션에서 허용하는 번호가 이 제한에 맞을 때만 사용하세요. 그렇지 않다면 패키지 방식이나 애플리케이션의 실제 요구 사항에 맞춘 유효성 검사기를 사용하세요.

E.164는 최대 15자리 숫자를 허용하며, 국제 표현에 쓰이는 앞의 +는 별도의 문자입니다. max_length=16인 필드에는 이 표현을 저장할 수 있지만, 길이 설정만으로 E.164 문법이나 국가별 번호 규칙이 적용되는 것은 아닙니다. 유효성 검사기에서 허용되는 접두사와 자릿수를 확인해야 하며, 국제 전화번호를 더 완전하게 검증하려면 번호 계획 메타데이터가 필요합니다. 두 모델 필드 중 어느 것을 사용하든 데이터 모델에 맞춰 번호의 고유성 여부와 필드의 빈 값 또는 null 허용 여부를 정하세요.