지난 글에서 전화번호를 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
로 설정한 정규식으로 검색하여, 유효성을 판단해주는 기능을 한다.
message
와 code
를 사용해서 ValidatorError
를 발생시킨다.Parameters
regex
re.search()
를 사용해서 제공된 값 내에서 검색할 정규식 패턴이다.re.compile()
로 만든 문자열 또는 미리 컴파일된 정규식일 수도 있다.default
는 빈 문자열message
ValidationError
에서 사용할 오류 메시지default
는 "Enter a valid value."
code
ValidationError
에서 사용할 오류 코드default
는 "invalud"
inverse_match
regex
에 대한 일치 모드default
는 False
flags
regex
를 컴파일할 때 사용되는 regex flags
TypeError
가 표시된다. default
는 0
그런데 예제 코드에 있는 정규식 코드는 좀 마음에 안 들어서 수정해보려고 한다.
내가 원하는 형식은 010-1234-5678
max_length
는 11
로 지정하고 싶다.
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)
추가적으로
CharField
에 max_length
를 11로 지정하고 (CharField
사용할 때 꼭 지정해줘야 함)unique
를 True
로 설정해준다. (동일한 전화번호로 중복해서 가입하지 못하도록 설정)이렇게 올바르게 입력하면 잘 저장되지만,
형식에 맞지 않은 값을 입력하면 이렇게 "올바른 값을 입력하세요."라고 뜬다!