Django Form의 Validation

Django의 폼 검증(Form Validation)은 데이터가 클린(Clean)될 때 이루어진다. 이 과정을 커스터마이징하는 것은 검증의 여러 단계에서 가능하다. 이 과정에서 ValidationError 예외를 일으키는 식으로 검증의 실패를 표현한다. 

기본적은 검증은 validator를 통해 이루어진다. validator는 인자 하나를 받아 검증한 다음, 실패하면 예외를 발생한다. 이 validator는 각 필드에 대해 to_python()과 validate()를 실행한 다음, 호출된다. 


Django의 폼 검증은 다음과 같은 순서로 이루어진다. 

1. Field의 to_python() 메소드. 이것은 HTML 폼의 문자열 입력을 Python 데이터형으로 변환하는 작업이다. 이 과정에서 ValidationError가 발생할 수 있다. 예를 들어 FloatField의 경우 텍스트를 float 타입으로 변환하는데, 문제가 있을 경우 예외를 만든다. 

2. 각 Field는 validate() 메소드를 호출한다. 

3. 각 Field의 run_validators()를 호출하여 validator를 실행한다. 이것을 override할 일은 없다. 

4. Field의 clean() 메소드가 to_python(), validate(), run_validators()를 순서대로 호출하고 예외를 처리할 책임을 갖는다. 정상적인 데이터는 cleaned_data에 집어 넣는다. 

5. 이제 Form으로 넘어온다. Form의 clean_<fieldname>() 메소드가 구현되어 있으면 이것을 호출훈다. 이 함수는 인자가 없고, 대신 self.cleaned_data 딕셔너리에 있는 값을 가져와서 체크하면 된다. 이 형식은 필드의 형식적인 변환이 아니라, 응용에 맞는 검증을 하는데 적절한다. 예를 들어 시리얼번호의 유일성을 체크해야 하는 clean_serialnumber() 식이 가능하다. 

6. 마지막으로 Form의 clean() 함수가 불린다. 여기서는 폼 필드 전체적으로 유기적인 상호관계에 오류가 없는지 점검하기 좋은 곳이다. clean() 안에서는 Form의 errors 속성에 접근할 수 있는데, 여기에 지금까지 점검한 에러가 담겨있다. 또한 Form.clean()에서 발생한 예외는 특정한 필드에 연관되지 않는다. 그래서 __all__ 이라는 이름에 엮이고, non_field_errors() 메소드로 접근 가능하다. 만일 특정 필드에 엮고 싶으면 add_error() 를 사용한다. 


모든 Validation이 완료되면, 마지막으로 View의 form_valid가 호출된다. 보통은 success_url로 넘기게 되지만, 여기서 form.add_error를 하고 self.form_invalid(form)을 리턴하면 다시 invalidate된다. 


원문: https://docs.djangoproject.com/en/3.1/ref/forms/validation/

댓글 없음:

댓글 쓰기

인기글