Form validation : django form(5)

2022. 4. 17. 21:07
  • 인프런 이진석 강사님의 장고강의를 참고

Form의 유효성검사가 실행되는 시점

  • form의 객체가 만들어지면서 요청으로 들어온 데이터가 해당 form에 들어간 후
  • form.is_valid()에서 유효성검사가 실행. 모든 필드에 대한 유효성 검사가 통과되면 True를 반환

 

유효성검사 내부 로직(Form이 자동으로 실행해주는 것임)

  1. form.is_valid() 실행 : 유효성 검사 실행
  2. form.is_valid()가 내부적으로 form.full_claen()호출.
  3. 호출된 full_clean()은 모든 필드에 대하여 필드객체.clean()를 호출해서 각 필드의 type에 대한 (장고 내부적으로 설정된 기본)유효성 검사를 실행함 ex)emailfield > 이메일 형식인지 검사함(@가 있는지 등등)\
    • 해당 필드에 대한 custom validator가 적용되어 있다면, 적용된 validator도 실행
  4. 일단 이까지 유효성 검사가 완료되면(문제가 없으면), 완료된 값들을 dict형태로 form.cleaned_data에 반환
  5. Form객체내에서, form객체.clean()이나 form객체.clean_필드명() 함수가 있다면 호출해서 유효성 검사를 진행
    • 두 함수는 커스터마이징해서 추가한 2차 유효성 검사정도로 생각하면 편함 
    • form객체.clean() : 한개 이상의 필드를 엮어서 실행하는 유효성 검사ex)서버마다 다른 아이디
    • form객체.clean_필드명() : 특정 필드 하나에 대해서만 따로 추가한 유효성 검사임
  6. 모든 clean, clean_필드명 함수에 의한 두번째 유효성 검사가 아무문제 없이 진행되면, form.is_valid()는 True를 반환
  7. 이때, clean,clean_필드명 함수에 의한 두번째 유효성 검사 결과에 의해 값이 변환될 수 있음. 변환된 값들은 다시한번 form.cleaned_data에 업데이트 됨

 

Form에서 진행되는 유효성 검사종류

  1. 설정된 필드에 따른, 장고 내부에서 제공하는 기본 유효성 검사
    • models.emailfield() > emailfield에 맞게 @가 있는지 체크
  2. validator 함수를 통한 유효성 검사
    • 리턴값이 없음
  3. form 클래스 내 clean, clean_멤버함수를 통한 유효성 검사 및 값 변경
    • 리턴값이 있고 그걸 활용할 수 있음. 따라서 리턴값조정을 통해 값을 변환시킬 수 있음
    • 아래의 예시에서, message함수에 의해 유효성 검사가 진행되면, clean_message가 호출된다
    • clean_message는 정규표현식을 사용해 영어를 모두 없애버림
    • 따라서, message에 영어를 입력하면 사라진다.
#models.py
from django import forms
from .models import Post
import re

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['message','photo','is_public']
        #exlude를 쓸 수도 있음(배제시킬 필드선택)

    def clean_message(self):
        message=self.cleaned_data.get('message')
        if message:
            message = re.sub(r'[a-zA-Z]+','',message)
        return message

 

Validator

  • 함수형 : 유효성 검사를 수행할 값 인자를 1개 받은 callable object
  • 클래스형 : 클래스의 인스턴스가 callable object
  • 가능하면, 모든 validator는 모델에 정의하고, 모델 폼을 통해 모델의 validator정보를 같이 가져오는 것을 추천

 

clean멤버함수를 사용할 때?

  • 특정 Form에 대한 1회성 유효성 검사 루틴이 필요할 때
  • 다수 필드값에 걸쳐서, 유효성 검사가 필요할 때
  • 필드값을 변경할 필요가 있을 때(validator는 필드값을 변경할 수 없음. 값의 체크만 가능)

BELATED ARTICLES

more