[Django] User 모델에 핸드폰 번호 저장하기

kiteB·2021년 11월 12일
3

Django

목록 보기
5/5
post-thumbnail

지난 글에서 전화번호를 PhoneNumberField를 이용해서 phone필드에 저장하려고 설정했는데,

프로젝트를 진행하면서 이 PhoneNumberField가 제대로 작동하지 않는 것을 확인했다 ㅠㅠ
(내 문제일수도^^)

그래서 찾아보니까 전화번호를 CharField로 받아서, 유효성 검사를 하는 방법도 있어서
이 방법을 활용해보려고 한다!


[ Sample Code ]

🔗 참고한 글

from django.core.validators import RegexValidator

class Person(models.Model):
    phoneNumberRegex = RegexValidator(regex = r"^\+?1?\d{8,15}$")
    phoneNumber = models.CharField(validators = [phoneNumberRegex], max_length = 16, unique = True)

흠,, 대충 RegexValidator라는 것을 이용해서 regex에 원하는 정규식을 넣고,
이를 이용해서 CharField에 입력된 값의 유효성 검증을 하는 것 같다!

RegexValidator를 조금 더 자세히 알아보자!


[ RegexValidator ]

class RegexValidator(regex=None, message=None, code=None, inverse_match=None, flags=0)

regex로 설정한 정규식으로 검색하여, 유효성을 판단해주는 기능을 한다.

  • 기본적으로 일치하는 내용이 없을 경우, messagecode를 사용해서 ValidatorError를 발생시킨다.

Parameters

  • regex
    • re.search()를 사용해서 제공된 값 내에서 검색할 정규식 패턴이다.
    • re.compile()로 만든 문자열 또는 미리 컴파일된 정규식일 수도 있다.
    • default는 빈 문자열
  • message
    • 유효성 검사에 실패한 경우, ValidationError에서 사용할 오류 메시지
    • default"Enter a valid value."
  • code
    • 유효성 검사에 실패한 경우, ValidationError에서 사용할 오류 코드
    • default"invalud"
  • inverse_match
    • regex에 대한 일치 모드
    • defaultFalse
  • flags
    • 정규식 문자열 regex를 컴파일할 때 사용되는 regex flags
    • 정규식이 미리 컴파일된 정규식이고, 플래그가 재정의된 경우 TypeError가 표시된다.
    • default0

[ 전화번호 정규식 ]

그런데 예제 코드에 있는 정규식 코드는 좀 마음에 안 들어서 수정해보려고 한다.
내가 원하는 형식은 010-1234-5678 max_length11로 지정하고 싶다.

🔗 정규식 코드 참고

r'^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})'
  • 01([0|1|6|7|8|9]?): 01 또는 01+0/1/6/7/8/9의 형태
  • -?: -가 있어도 되고 없어도 된다.
  • ([0-9]{3,4}): 0부터 9까지의 숫자가 3~4개 있어야 한다.
  • ([0-9]{4}): 0부터 9까지의 숫자가 4개 있어야 한다.

예시

  • 010-1234-5678 → ⭕
  • 01012345678 → ⭕
  • 01212341234 → ❌
  • 010-1234-56789 → ❌

[ 프로젝트에 적용해보기 ]

이제 정규식도 수정했으니 User 필드를 다시 수정해보자!

class User(AbstractUser):
    nickname = models.CharField(max_length=50)
    phoneNumberRegex = RegexValidator(regex = r'^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$')
    phone = models.CharField(validators = [phoneNumberRegex], max_length = 11, unique = True)

추가적으로

  • CharFieldmax_length를 11로 지정하고 (CharField 사용할 때 꼭 지정해줘야 함)
  • uniqueTrue로 설정해준다. (동일한 전화번호로 중복해서 가입하지 못하도록 설정)

[ 실행 결과 ]

이렇게 올바르게 입력하면 잘 저장되지만,

형식에 맞지 않은 값을 입력하면 이렇게 "올바른 값을 입력하세요."라고 뜬다!

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글