Form에서 유효성을 검증하는 것은 모델에서 썼던 필드 옵션과 validator들을 그대로 사용할 수 있습니다.
모델을 쓰지 않는 일반 폼의 경우 각각의 폼 필드를 작성해주어야 하고,
그때 필드 옵션과 Validator를 사용할 수 있습니다.
# validators.py
from django.core.exceptions import ValidationError
def validate_symbols(value):
if ("@" in value) or ("#" in value):
raise ValidationError("'@'와 '#'은 내용에 포함될 수 없습니다.", code='symbol-err')
# forms.py
from django import forms
from .models import Post
from .validators import validate_symbols
class PostForm(forms.ModelForm):
memo = forms.CharField(max_length=80, validators=[validate_symbols]
위의 두 코드중 첫 번째는 내용에 '@' 또는 '#'이 들어가 있을 경우 오류를 발생시켜주는 validator를 작성한 코드이고,
두 번째는 그 validator를 적용시킨 것입니다.
form을 작성한 후, 그 form 뒤에 인자로 넣어주기만 하면 작성한 validator가 일을 하게 됩니다.
clean_필드네임
하지만 위와 같은 방법 말고도 'clean_필드네임' 을 사용한 유효성 검증 방법도 있습니다.
# forms.py
from django import forms
from .models import Post
from .validators import validate_symbols
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
def clean_title(self):
title = self.cleand_data['title']
Form 클래스에는 기본적으로 위 코드의 마지막 줄에 작성된 cleaned_data 라는 것을 가지고 있는데 이 안에는 폼 필드를 정의할 때 넣어준 유효성 검증을 통과한 데이터가 들어있습니다.
만약 폼 필드를 사용하지 않았다면 유저가 입력한 데이터가 그대로 넘어오게 됩니다.
위 코드에서는 폼 필드에 유효성 검증을 넣어준 것이 없기 때문에 cleand_data 에는 유저가 입력한 그대로의 값이 들어가 있습니다.
# forms.py
from django import forms
from .models import Post
from .validators import validate_symbols
from django.core.exceptions import ValidationError
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
def clean_title(self):
title = self.cleand_data['title']
if '*' in title:
raise ValidationError('*은 제목에 들어갈 수 없습니다')
return title
그리고 위와 같이 작성하게 된다면 제목에 * 을 입력할 수 없게 유효성 검증을 넣을 수 있게 됩니다.
이런 clean_필드가 Validator와 다른 점은 clean_필드는 하나의 필드에 대해서만 검증이 가능하고 유효성 검증 에러를 내는 것과 상관없이 항상 마지막처럼 return을 통해 cleaned_data에서 가져온 값을 반환해줘야 합니다.
하지만 Validaor는 한번 정의하면 모델과 폼 모두에서 사용이 가능하고 여러 필드에서 사용이 가능합니다.
'Study > Django' 카테고리의 다른 글
Django NoReverseMatch at Error (0) | 2021.12.12 |
---|---|
Django Model Queryset API / 장고 모델 쿼리셋 API (0) | 2021.12.12 |
Django Validator / 장고 유효성 검증 / validator 추가하기 (0) | 2021.12.10 |
Django Validator / 장고 유효성 검증 / 내장 Field 옵션 (0) | 2021.12.10 |
Django의 CSRF 방지 / CSRF / Cross-Site Request Forgery (0) | 2021.12.09 |