inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

11-10 회원가입 시에 이메일 주소를 필수로 받기

11-10 clean_email(self) 메소드의 동작 방식에 대해서 궁금합니다.

해결된 질문

109

천진한

작성한 질문수 2

1

image.png

이진석 강사님 안녕하세요,

올려주신 Django 강의를 차근 차근 따라가며 즐겁게 학습하고 있습니다. 작성해주신 코드에 대한 동작 원리를 이해하려고노력하면서 수강하고 있습니다.

 

그 과정에서 작성하신 코드의 동작 원리에 관련해서 궁금한 게 있어서 이렇게 질문 드려요 🙂

11-10 강의에서 SignupForm 모델 폼에서 clean_email(self) 메서드를 정의하여 입력 받은 email 값에 대한 유일성을 검사하는 코드 관련해서 궁금한 점이 있습니다.

감사합니다!

react python django web-api htmx

답변 1

1

이진석

안녕하세요.

깊이있는 질문을 주셔서 너무나 감사드립니다. ;-)

차근차근 설명드리겠습니다.


모든 장고 Form은 BaseForm 클래스를 상속받습니다. 아래 링크의 is_valid 메서드 구현을 보시면요.
https://github.com/django/django/blob/4.2.16/django/forms/forms.py#L199

아래와 같이 errors 속성 여부를 검사하게 되구요.

붙여넣은_이미지_10_5_24_15_14.png

errors 구현에서는 유효성 검사가 수행된 적이 없을 때 full_clean 메서드를 호출하게 됩니다.

image.png

full_clean 메서드가 호출되면, errors 인스턴스 변수를 초기화하고 에러 내역을 담을 준비를 하구요. _clean_fields 메서드를 호출하여, 필드별 유효성 검사를 수행합니다. // 각 폼 필드 별로 준비된 유효성 검사를 .clean 메서드를 호출하여 수행하구요. 이어서 hasattr(self, "clean_%s" % name) 코드로 현재 폼 인스턴스에 clean_필드명 메서드가 있는 지 확인하여 있다면 호출하여, 그 반환값을 self.cleaned_data 사전에 반영합니다.

붙여넣은_이미지_10_5_24_15_16.png

 

_clean_fields 메서드 구현에 두번째 질문에 대한 답도 있습니다. 각 유효성 검사 함수를 호출한 뒤에 반환값으로 받은 value 값을 self.cleaned_data[name] = value 코드를 통해 반영하고 있습니다.

 

세번째 질문에 대한 답변으로서, Form에서는 Form 클래스 정의 시에 validators 인자를 통해 유효성 검사 로직을 추가할 수도 있고, Form 인스턴스 생성 시에 clean_필드명 메서드를 재정의해서 유효성 검사 로직을 추가할 수도 있습니다.

  1. 구현하실려는 유효성 검사 로직이 UserCreationForm 폼 클래스에서만 필요한 1회성 로직이라면 clean_username 메서드를 통해 구현하실 수 있겠습니다.

  2. 혹은 username 필드에 대한 유효성 검사 시에 username 값 외에 다른 필드값에 대한 참조가 필요한 경우 (예를 들어, 게임 서버에서는 다수의 서버가 있고, 서버가 다르다면 다른 서버의 username을 현재 서버에서 사용할 수 있습니다. 그러니 유일성 체크에서는 server_name과 username을 같이 체크해야할 것입니다.), clean 메서드를 재정의하여 server_name 값과 username 값을 동시에 확인하여 유효성 검사를 수행하여야 합니다.

  3. 수행하실려는 유효성 검사가 다른 필드에서도 반복되어 사용이 되는 경우라면, 매 폼 필드마다 유효성 검사를 수행하시는 코드를 리팩토링해서, 커스텀 Form 필드로 구현하시고, 그 안에서 유효성 검사를 수행토록 해보실 수 있습니다.

 

충분한 답변이 되었을 지 잘 모르겠습니다.

살펴보시고, 추가 질문은 댓글로 남겨주세요. :-)

1

천진한

자세한 설명 정말 감사합니다. 🙂

강사님, 덕분에 궁금했던 코드의 내부 동작 흐름을 이해했습니다!

강의에서 정의한 clean_email 메서드가 호출되는 시점이 언제인지 강사님의 친절한 설명과 첨부해주신 소스코드 캡쳐 이미지를 보고 이해할 수 있었습니다!

value = getattr(self, "clean_%s" % name)

이 코드가 동작해서 강의에서 정의한 clean_email 메서드의 반환 값인 email 변수 값을 value 변수에 담는군요. 그리고 self.cleaned_data[name] = value 코드를 통해 cleaned_data 사전에 값을 할당하는 것도 확인했습니다 🙂

폼 객체를 통해 입력 받은 필드 값에 대한 유효성 검사 로직을 구현하는 방법이 여러가지 케이스가 있군요. 직접 프로젝트를 구현할 때 참고하겠습니다.

주말임에도 불구하고 알찬 답변 달아주셔서 정말 정말 감사합니다. 좋은 주말 보내세요!

1

이진석

마무리 정리까지 완벽하십니다~!!! 화이팅입니다. ;-)

Django의 View나 URL의 네이밍 컨벤션

0

60

1

08-14 FormView 관련 질문

0

72

1

07-01 IPv4AddressIntegerField 질문

0

82

1

14-08 수업 확인 요청 드립니다.

0

91

2

nextjs git 관리?

0

75

1

14-07에서 SESSION_COOKIE_DOMAIN = None 처리 필요.

0

75

2

고민

0

219

3

django-component==0.139 실행 시 오류

0

167

2

django-csp 4.0 migration 관련

0

122

2

01 윈도우 개발환경 설치 문의

0

99

1

강의 자료 문의

0

129

2

선생님 학습 방법 질문이 있습니다.

0

154

2

bulk_update에서 updated_at 필드

0

124

1

정규표현식

0

107

2

선생님 질문 있습니다.

0

80

1

공유자님 이 강의 공부 방법에 대한 질문입니다.

0

181

2

mydjango.py 질문 있습니다.

0

147

3

Django-Components의 0.128 세팅

0

226

3

질문 아님.

0

127

1

mydjango.py 실습 질문있습니다.

0

87

2

pycharm 개발환경 설정 오류

0

182

2

강의 듣다가 유료pycharm에 비해 vscode지원기능이 아쉬워서 확장프로그램 만들었는데 여기 공유해도 될까요?

0

167

1

중단점에 대한 질문 있습니다.

0

133

2

todo / react 붙이는 깃주소를 받고 싶습니다.

0

179

6