폼을 사용하여 데이터 검증하기
Form.clean()
서로 의존되어 있는 필드들을 위한 커스텀 검증을 추가해야 할때는, 폼에 clean() 메서드를 써주면 됩니다.
Form.is_valid()
폼 객체의 기본 과제는, 데이터를 검증하는것입니다.
Bound 폼 인스턴스를 가지고, is_valid()
메서드를 호출하여 유효성 검증을 실행하고, 데이터가 유효했었는지 아닌지에 대한 불리언값을 반환합니다.
1 | In [1]: data = {'subject': 'hello', |
유효하지 않은 데이터로도 시도해보기 위해서, 아래 예시에는 subject 필드가 비어있습니다 (모든 필드들이 채워져야 하는 폼이므로, 이것은 에러 입니다). 게다가, 아래 예시에서, sender 는 유효한 이메일 주소가 아니게 입력 된 폼입니다.
1 | In [5]: data = {'subject': '', |
Form.errors
에러 속성을 error messages 의 사전에서 가져옵니다.
1 | In [8]: f.errors |
해당 사전에서, keys 는 필드 이름들이고, Values 는 에러 메시지들을 문자열로 표시한 리스트 입니다.
에러 메시지들은 리스트에 저장 되어 있습니다. 왜냐하면, 하나의 필드는 여러개의 에러 메시지들을 가질수도 있기 때문입니다.
is_valid()
를 호출하지 않아도, errors 에 엑세스 할수 있습니다.
폼의 데이터는 처음 is_valid() 혹은 errors 에 호출하거나 access 할때 유효성 검사가 이루어 집니다.
유효성 루틴은 오직 한번만 호출됩니다. 몇번에 걸쳐서 errors 를 접근을 하던, is_valid() 를 호출하던. 딱 한번만 유효성 검사가 이루어집니다. 이것이 의미하는 바는, 유효성이 다른 부작용이 있을때, 부작용들은 오직 한번만 일어난다는것을 의미합니다.
Form.errors.as_data()
오리지널 ValidationError 인스턴스들을 매핑하는 사전을 반환합니다.
1 | In [9]: f.errors.as_data() |
코드로 에러를 식별하고 싶을때, 이 메서드를 사용합니다. 이 메서드는 에러의 메시지를 재작성 하거나 에러가 있을때, 뷰 안에 커스텀 로직을 작성할수 있게 해줍니다.
또한, 에러들을 커스텀 형태, (예, XML) 로 직력화 하는데에도 사용될수 있습니다.
예를들면, as_json() 은 as_data() 에 의존하는 메서드 입니다.
Form.errors.as_json(escape_html=False)
에러를 직렬화된 JSON 으로 반환합니다.
1 | In [10]: f.errors.as_json() |
기본값으로, as_json() 은 그 결과를 escape 하지 않습니다.
만약 AJAX 요청 같은 것을 Form View 에 사용하고 있다면, (Form view 에서 클라이언트는 응답을 해석하여, 에러들을 페이지에 삽입하고, 당신은 사이트간 스크립팅 공격의 가능성을 피하기 위해서, 클라이언트 사이드에 결과들을 escape 하고 싶을것입니다). 이는, JavaScript 로 element.textContext = errorText 혹은 jQuery의 $(el).text(errorText) 를 사용해서 해결할수 있습니다.
만약 어떠한 이유로인해, client-side escaping 을 원치 않는다면, escape_html=True 를 설정해 주면 됩니다. 그리고 에러 메시지들은 escaped 되어서, 직접 HTML 안에 사용할수 있습니다.
Form.errors.get_json_data(escape_html=False)
JSON 으로 직렬화하기 좋은 사전으로 에러들을 반환합니다.
form.errors.as_json() 은 직렬화된 JSON 을 반환 합니다. 하지만, Form.errors.get_json_data() 는 직렬화 되기 전 에러 데이터를 반환 합니다.
escape_html 파라미터는, Form.errors.as_json() 에서 나온것처럼 작동합니다.
Form.add_errors(field,error)
이 메서드는 에러들을 Form.clean() 메서드 안에서 혹은 폼의 바깥에서 특정 필드들에 추가할수 있게 해줍니다.
field 인자는 필드의 이름이고, 에러가 추가되어야 하는 필드입니다. 이 값이 None 이면, 에러는 non-field 에러로 간주됩니다.
error 인자는 문자열로 될수 있습니다 혹은 ValidationError 의 인스턴스가 선호될수 있습니다.
Form.add_error() 는 자동으로 cleaned_data 부터 연결된 필드들을 지워줍니다.
Form.has_error(field, code=None)
필드가 특정 에러코드를 가진 에러를 가지고 있는지 없는지 Boolean 값을 리턴합니다.
만약 code 가 None 이면, 필드가 어떤 에러들을 가지고 있을경우, True 를 반환합니다.
non-field errors 를 확인하기 위해서는, NON_FIELD_ERRORS 를 field 파라미터로 사용할수 있습니다.
Form.non_field_errors()
이 메서드는 특정 필드와 연관이 없는 Form.errors 로 부터 에러들의 리스트를 반환합니다.
이는 Form.clean() 과 Form.add_errors를 사용하여 추가된 에러들에 발생된 ValidationErrors 들을 포함합니다.
정리
Method | role |
---|---|
clean() | 서로 의존하는 필드들을 위한 사용자 검증이 필요할때 |
is_valid() | Bound 된 폼 인스턴스의 유효성 검사. Boolean 값을 반환 |
.errors | error messages 사전을 가져오기 위한 errors 속성에 엑세스 합니다. |
.errors.as_data() | 오리지널 ValidationError 인스턴스들을 매핑하는 사전을 반환 합니다. |
.errors.as_json() | 에러를 직렬화된 JSON 으로 반환합니다. |
.errors.get_json_data(escape_html=False) | 에러들을 JSON 으로 직렬화하기 좋은 형태의 사전으로 반환합니다. |
.add_error(field, error) | 특정 필드에 에러를 추가할수 있게 해줍니다. |
.has_error(field, code=None) | 필드가 특정 코드를 가진 에러를 가지고 있는지 없는지 Boolean을 리턴합니다. |
.non_field_errors() | 특정 필드와 연결되지 않은 Form.errors 로부터 에러의 리스트를 반환합니다. |