[Django] (Docs) Form and field validation

azzurri21·2022년 1월 17일
0

Django

목록 보기
3/7

Django 공식 문서 Form and field validation를 읽고 이해한 내용을 정리한다. 자세한 설명 및 예시 코드는 공식 문서에 있다.

폼을 통한 입력에 대해 이루어지는 유효성 검사 과정 및 구현을 다룬다.


Field Error와 Non-Field Error

Django Form의 유효성 검사는 크게 (단일) 필드와 (여러 필드 간) 폼 단위로 구분되어 진행된다. (단일) 필드 검사를 통과하지 못할 때 발생하는 에러를 field error, 폼 단위에서 필드 사이의 관계를 검사할 때 발생하는 에러를 non-field error라고 부른다.

예를 들어 비밀번호 찾기에서 사용했던 PasswordResetForm를 살펴보자. 사용자는 폼에 사용자ID와 이메일을 입력한다. 추가되는 유효성 검사는 아래와 같다.

# validation 절차:
# 1. username에 대응하는 User 인스턴스의 존재성 확인                -> 필드 단위 검사
# 2. username에 대응하는 email과 입력받은 email이 동일한지 확인      -> 폼 단위 검사(여러 필드 사이 관계)

사용자ID가 DB에 존재하는지 확인하는 작업은 필드 유효성 검사, 사용자ID에 대응하는 이메일이 제대로 입력되었는지 확인하는 작업은 폼 유효성 검사에 해당한다. (여러 필드 사이의 적절성을 검사하므로)

유효성 검사 구현

폼에 값을 입력할 때 진행되는 유효성 검사 절차는 아래와 같다. Form에 포함된 어떠한 필드를 Field 클래스의 인스턴스라고 하자. 오버라이딩할 필요 없는 메서드에는 취소선을 그었다.

  1. Field 클래스의 to_python() 메서드
  2. Field 클래스의 validate() 메서드 (오버라이딩 X)
  3. Field 클래스의 run_validators() 메서드 (오버라이딩 X)
  4. Field 클래스의 clean() 메서드
  5. Form 클래스의 clean_<fieldname>() 메서드 (<fieldname>은 폼 필드 속성 이름)
  6. Form 클래스의 clean() 메서드

각 메서드 내부에서는 유효성 검사를 통과하지 못하는 경우에 ValidationError를 발생시킨다. 공식 문서에는 ValidationError에 매개변수를 전달하는 좋은 예시가 나와있다.

1~5는 필드 자료형, 값에 관한 것으로 Field Error에 해당한다.
6은 필드 여러 개를 고려한 것으로 Non Field Error에 해당한다.

5는 폼의 메서드에 구현하는 Field Error로, 필드의 자료형과 관계 없이 값 자체의 유효성을 검사한다.

profile
파이썬 백엔드 개발자

0개의 댓글