Form validation : django form(5)
2022. 4. 17. 21:07
- 인프런 이진석 강사님의 장고강의를 참고
Form의 유효성검사가 실행되는 시점
- form의 객체가 만들어지면서 요청으로 들어온 데이터가 해당 form에 들어간 후
- form.is_valid()에서 유효성검사가 실행. 모든 필드에 대한 유효성 검사가 통과되면 True를 반환
유효성검사 내부 로직(Form이 자동으로 실행해주는 것임)
- form.is_valid() 실행 : 유효성 검사 실행
- form.is_valid()가 내부적으로 form.full_claen()호출.
- 호출된 full_clean()은 모든 필드에 대하여 필드객체.clean()를 호출해서 각 필드의 type에 대한 (장고 내부적으로 설정된 기본)유효성 검사를 실행함 ex)emailfield > 이메일 형식인지 검사함(@가 있는지 등등)\
- 해당 필드에 대한 custom validator가 적용되어 있다면, 적용된 validator도 실행
- 일단 이까지 유효성 검사가 완료되면(문제가 없으면), 완료된 값들을 dict형태로 form.cleaned_data에 반환
- Form객체내에서, form객체.clean()이나 form객체.clean_필드명() 함수가 있다면 호출해서 유효성 검사를 진행
- 두 함수는 커스터마이징해서 추가한 2차 유효성 검사정도로 생각하면 편함
- form객체.clean() : 한개 이상의 필드를 엮어서 실행하는 유효성 검사ex)서버마다 다른 아이디
- form객체.clean_필드명() : 특정 필드 하나에 대해서만 따로 추가한 유효성 검사임
- 모든 clean, clean_필드명 함수에 의한 두번째 유효성 검사가 아무문제 없이 진행되면, form.is_valid()는 True를 반환
- 이때, clean,clean_필드명 함수에 의한 두번째 유효성 검사 결과에 의해 값이 변환될 수 있음. 변환된 값들은 다시한번 form.cleaned_data에 업데이트 됨
Form에서 진행되는 유효성 검사종류
- 설정된 필드에 따른, 장고 내부에서 제공하는 기본 유효성 검사
- models.emailfield() > emailfield에 맞게 @가 있는지 체크
- validator 함수를 통한 유효성 검사
- 리턴값이 없음
- 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는 필드값을 변경할 수 없음. 값의 체크만 가능)
'django > basic' 카테고리의 다른 글
로그인처리(LoginView) , 프로필 수정 // 장고 기본인증(1) (0) | 2022.04.19 |
---|---|
Generic editing views // Forms(6) (0) | 2022.04.18 |
CSRF 공격&CSRF Token // django form(4) (0) | 2022.04.17 |
ModelForm // django Form(3) (0) | 2022.04.17 |
HttpRequest와 HttpResponse // django form(2) (0) | 2022.04.17 |