Django 공식 문서 Form and field validation를 읽고 이해한 내용을 정리한다. 자세한 설명 및 예시 코드는 공식 문서에 있다.
폼을 통한 입력에 대해 이루어지는 유효성 검사 과정 및 구현을 다룬다.
Django Form의 유효성 검사는 크게 (단일) 필드와 (여러 필드 간) 폼 단위로 구분되어 진행된다. (단일) 필드 검사를 통과하지 못할 때 발생하는 에러를 field error, 폼 단위에서 필드 사이의 관계를 검사할 때 발생하는 에러를 non-field error라고 부른다.
예를 들어 비밀번호 찾기에서 사용했던 PasswordResetForm를 살펴보자. 사용자는 폼에 사용자ID와 이메일을 입력한다. 추가되는 유효성 검사는 아래와 같다.
# validation 절차:
# 1. username에 대응하는 User 인스턴스의 존재성 확인 -> 필드 단위 검사
# 2. username에 대응하는 email과 입력받은 email이 동일한지 확인 -> 폼 단위 검사(여러 필드 사이 관계)
사용자ID가 DB에 존재하는지 확인하는 작업은 필드 유효성 검사, 사용자ID에 대응하는 이메일이 제대로 입력되었는지 확인하는 작업은 폼 유효성 검사에 해당한다. (여러 필드 사이의 적절성을 검사하므로)
폼에 값을 입력할 때 진행되는 유효성 검사 절차는 아래와 같다. Form에 포함된 어떠한 필드를 Field 클래스의 인스턴스라고 하자. 오버라이딩할 필요 없는 메서드에는 취소선을 그었다.
Field
클래스의 to_python()
메서드Field
클래스의 validate()
메서드Field
클래스의 run_validators()
메서드Field
클래스의 clean()
메서드Form
클래스의 clean_<fieldname>()
메서드 (<fieldname>
은 폼 필드 속성 이름)Form
클래스의 clean()
메서드각 메서드 내부에서는 유효성 검사를 통과하지 못하는 경우에 ValidationError
를 발생시킨다. 공식 문서에는 ValidationError
에 매개변수를 전달하는 좋은 예시가 나와있다.
1~5는 필드 자료형, 값에 관한 것으로 Field Error에 해당한다.
6은 필드 여러 개를 고려한 것으로 Non Field Error에 해당한다.
5는 폼의 메서드에 구현하는 Field Error로, 필드의 자료형과 관계 없이 값 자체의 유효성을 검사한다.