Django – 유효성 검사에 대한 글
수많은 정보를 저장하고 꺼내오고 해야 하는 시대에 Django 로 서비를 만들고 하다보면, 각각 필드의 유효성 검사에 대한 고민이 엄청 많다.
폼에서 하나 자바스크립트로 하나 model 에서 하나…등등등 아래 글에서 인사이트를 얻어보자 잘 정리해 두셨네. 강의를 들으면서 정리하신 내용 같은데 많은 도움이 되었어요 😊
내가 만든 예제코드
from django.core.validators import MinLengthValidatordef validate_isdecimal(value): if not value.isdecimal(): raise ValidationError( _("%(value)s is not an deciamal number"), params={"value": value}, )class Company(models.Model): name = models.CharField(max_length=255) vatid = models.CharField(max_length=255, unique=True, validators=[validate_isdecimal, MinLengthValidator(10)]) # 숫자가 아니거나, 10자리 이하는 에러 반환
결론
아니… 그러면 언제 Validators를 써야하고, 언제 clean을 써야해???
가급적이면 모든 validators는 model에 정의하고, ModelForm을 통해서 model validators 정보도 같이 가져와야 한다.
**validators는 웬만하면 model에 정의하자!!**
😊
clean() 을 오버라이드해서, validator에 위배되는 행동을 만약 clean() 함수 내에서 허용하면, 암만 모델에 정해둬도 유효성을 무시하고 데이터가 처리됨을 명심하시길!! form.is_valid() 이전에 호출 되기 때문 같네.
clean이 필요할 때는,
- 특정 Form에서 1회성 유효성 검사 루틴이 필요할 때
- 다수 필드값에 걸쳐서, 유효성 검사가 필요할 때
- 필드 값을 변경할 필요가 있을 때 #validators는 값만 체크하고, 변경할 수는 없다.
빌트인 유효성 검사를 사용해
공식 사이트에서 제공하는 이미 준비된 Validators 들이 있다. 보고 활용을 하자.
예제
from django.core.validators import MinLengthValidatorclass GameUserSignupForm(forms.ModelForm): class Meta: model = GameUser fields = ['server','username'] def clean_username(self): # 필드명에 clean_을 붙여서 각 필드별로 유효성 처리및 데이터 변경을 수행함 return self.cleaned_data.get('username', '').strip()