당신은 멋쟁이, 우리는 장고쟁이~

0%

Form API 2편 - 폼을 사용하여 데이터 검증하기

폼을 사용하여 데이터 검증하기


Form.clean()


서로 의존되어 있는 필드들을 위한 커스텀 검증을 추가해야 할때는, 폼에 clean() 메서드를 써주면 됩니다.


Form.is_valid()


폼 객체의 기본 과제는, 데이터를 검증하는것입니다.


Bound 폼 인스턴스를 가지고, is_valid() 메서드를 호출하여 유효성 검증을 실행하고, 데이터가 유효했었는지 아닌지에 대한 불리언값을 반환합니다.


1
2
3
4
5
6
7
8
9
10
11
In [1]: data = {'subject': 'hello', 
...: 'message': 'Hi there',
...: 'sender': 'foo@example.com',
...: 'cc_myself': True}

In [2]: from forms_more_on_fields.forms import ContactForm

In [3]: f = ContactForm(data)

In [4]: f.is_valid()
Out[4]: True

유효하지 않은 데이터로도 시도해보기 위해서, 아래 예시에는 subject 필드가 비어있습니다 (모든 필드들이 채워져야 하는 폼이므로, 이것은 에러 입니다). 게다가, 아래 예시에서, sender 는 유효한 이메일 주소가 아니게 입력 된 폼입니다.



1
2
3
4
5
6
7
8
9
In [5]: data = {'subject': '', 
...: 'message': 'Hi there',
...: 'sender': 'invalid email address',
...: 'cc_myself': True}

In [6]: f = ContactForm(data)

In [7]: f.is_valid()
Out[7]: False




Form.errors


에러 속성을 error messages 의 사전에서 가져옵니다.


1
2
3
4
In [8]: f.errors                                                                                                                                                       
Out[8]:
{'subject': ['This field is required.'],
'sender': ['Enter a valid email address.']}

해당 사전에서, keys 는 필드 이름들이고, Values 는 에러 메시지들을 문자열로 표시한 리스트 입니다.

에러 메시지들은 리스트에 저장 되어 있습니다. 왜냐하면, 하나의 필드는 여러개의 에러 메시지들을 가질수도 있기 때문입니다.


is_valid() 를 호출하지 않아도, errors 에 엑세스 할수 있습니다.


폼의 데이터는 처음 is_valid() 혹은 errors 에 호출하거나 access 할때 유효성 검사가 이루어 집니다.


유효성 루틴은 오직 한번만 호출됩니다. 몇번에 걸쳐서 errors 를 접근을 하던, is_valid() 를 호출하던. 딱 한번만 유효성 검사가 이루어집니다. 이것이 의미하는 바는, 유효성이 다른 부작용이 있을때, 부작용들은 오직 한번만 일어난다는것을 의미합니다.


Form.errors.as_data()


오리지널 ValidationError 인스턴스들을 매핑하는 사전을 반환합니다.


1
2
3
4
In [9]: f.errors.as_data()                                                                                                                                             
Out[9]:
{'subject': [ValidationError(['This field is required.'])],
'sender': [ValidationError(['Enter a valid email address.'])]}

코드로 에러를 식별하고 싶을때, 이 메서드를 사용합니다. 이 메서드는 에러의 메시지를 재작성 하거나 에러가 있을때, 뷰 안에 커스텀 로직을 작성할수 있게 해줍니다.


또한, 에러들을 커스텀 형태, (예, XML) 로 직력화 하는데에도 사용될수 있습니다.


예를들면, as_json() 은 as_data() 에 의존하는 메서드 입니다.



Form.errors.as_json(escape_html=False)


에러를 직렬화된 JSON 으로 반환합니다.


1
2
3
In [10]: f.errors.as_json()                                                                                                                                            
Out[10]: '{"subject": [{"message": "This field is required.", "code": "required"}],
"sender": [{"message": "Enter a valid email address.", "code": "invalid"}]}'

기본값으로, 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 로부터 에러의 리스트를 반환합니다.