IT/WEB

[Django] Form의 cleaned_data 그리고 is_valid()시 호출되는 메소드의 순서

개발자 두더지 2022. 7. 3. 22:45
728x90

일본의 블로그 글을 번역한 포스트입니다. 오역 및 직역, 의역이 있을 수 있으며 틀린 내용이 있으면 지적해주시면 감사하겠습니다.

 

 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

https://kuma-server.com/cleaned_data/

https://kohei1116.hateblo.jp/entry/2018/01/14/154929

728x90