※ 일본의 블로그 글을 번역한 포스트입니다. 오역 및 직역, 의역이 있을 수 있으며 틀린 내용이 있으면 지적해주시면 감사하겠습니다.
Django의 Form 관련 코드를 보면 종종 cleaned_data가 기재되어 있는 경우가 있다. Django의 Form에서 사용하는 cleaned_data에 대해서 이것이 어떤 것인가 그리고 어떠할 때 사용하는가에 대해서 해설하도록 하겠다. 그리고 추가로 is_valid() 일 때 호출되는 메소드의 순서 등에서도 간단하게 알아보도록 하겠다.
cleaned_data이란?
cleaned_data는 form 안에서 validate된 후에, 즉 검증된 후의 적당한 데이터가 들어 있는 변수가 cleand_data이다. 즉 Form의 처리 흐름으로 설명하자면 다음과 같다.
1. forms.py에 폼을 작성
2. 폼에 데이터를 입력
3. 입력 데이터를 검증(validate)
→ is_valid()로 작성된다. 여기서 데이터가 폼에 입력되기 적당한지를 판별한다.
4. 적절한 데이터로 판명된 후에, cleaned_data에 값이 대입
즉 여기서 4번에 해당하는 것이 바로 cleaned_data이다.
예를 통해서 설명하자면 forms.py에 다음과 같은 폼이 정의되있다고 가정하자.
from django import forms
class TestForm(forms.Form):
Name = forms.CharField()
Age = forms.IntegerField()
Name은 문자열을 넣는 필드이고 공백을 넣으면 False가 출력된다. 또한 Age는 정수 필드이다. 여기에 3개의 데이터를 넣어 cleaned_data가 어떤 식으로 출력되는지를 비교해보자.
data1 = { "Name" : "John", "Age" : 20}
data2 = { "Name" : "Mike", "Age": "Nodata"}
data3 = { "Name" : "", "Age" : 20}
결과를 살펴보면 다음과 같다.
from forms import TestForm
data1 = { "Name" : "John", "Age" : 20}
data2 = { "Name" : "Mike", "Age": "Nodata"}
data3 = { "Name" : "", "Age" : 20}
f1 = TestForm(data1)
f1.is_valid()
>> True
f1.cleaned_data
>>{'Name': 'John', 'Age': 20}
f2 = TestForm(data2)
f2.is_valid()
>> False
f2.cleaned_data
>>{‘Name': 'Mike'}
f3= TestForm(data3)
f3.is_valid()
>> False
f3.cleaned_data
>>{'Age': 20}
data1은 검증 후, True가 출력되고 적절한 값이 cleaned_data에 대입되어 있는 것을 알 수 있다. 그러나 data2는 검증 결과가 False로 data2의 "age"가 적절하지 못한 값이기 때문에 cleaned_data에 "Name" 데이터만 존재한다. 그리고 data3도 data2와 동일하게 "Name"의 값이 적절하지 못하기 때문에 False의 결과가 발생했고 그 결과 cleaned_data에는 "Age"만 들어 있게 된다.
참고로 cleaned_data는 사전형으로 각 필드의 값을 사용하기 위해서는 키 값을 입력해야 한다. "Name" 값을 이용하기 위해서는 form.cleaned_data["Name"]과 같은 식으로 말이다.
is_valid() 시, 호출되는 메소드의 순서
- form.errors()
- form.full_clean()
- form.cleaned_data생성
- form._clean_fields()
- field.clean()
- form.clean<field명>()
- form._clean_form()
- form.clean()
- form._post_clean()
위와 같다. 그러면 각 메소드의 특징에 대해서 간단히 알아보자.
clean()
field.clean()과 form.clean() 이렇게 두 종류가 있다.
field.clean()의 특징은 각 field의 값에 대해 validation을 체크하며 반환 값은 filed의 값이다. 한편 form.clean()은 기본적으로는 cleaned_data를 반환할 분이며, cleaned_data를 다룰 수 있기 위해 각 field에 맞는 validation 체크를 할 수 있으며 반환값은 slef.cleaned_data가 된다.
form.clean<field명>()
각 filed의 값에 대해 validation체크를 한다. 리턴값은 field의 값이다.
form.cleaned_data
dict형태의 변수이며, form.full_clean() 내에서 생성된다. 맨 처음에는 field.clean()이 반환한 값이 저장되어 있다. form_clean_<field명>(), form.clean() 등으로 값을 다룰 수 있어 반환된 값이 저장된다.
참고자료
https://torajirousan.hatenadiary.jp/entry/2018/10/09/002544
'IT > WEB' 카테고리의 다른 글
[Django] 일대다 관계 구축하기:ForeignKey (카테고리, 댓글, 대댓글 등) (0) | 2022.07.11 |
---|---|
[Django] 페이지네이션(페이징) (0) | 2022.07.09 |
[Django] 인증 유저(super, staff, active)의 권한에 따른 액세스 제한, 표시제한을 설정하기 (0) | 2022.07.03 |
[Django] 클래스 베이스 뷰(Class Based View), 함수 베이스 뷰(Function Based View) (0) | 2022.07.01 |
[Django] User모델 커스터마이즈하기 (커스텀 User 모델) (0) | 2022.06.29 |