Django - 유효성 검사에 대한 글

Django - 유효성 검사에 대한 글
Photo by Kenny Eliason / Unsplash

수많은 정보를 저장하고 꺼내오고 해야 하는 시대에 Django 로 서비를 만들고 하다보면, 각각 필드의 유효성 검사에 대한 고민이 엄청 많다.

폼에서 하나 자바스크립트로 하나 model 에서 하나...등등등 아래 글에서 인사이트를 얻어보자 잘 정리해 두셨네. 강의를 들으면서 정리하신 내용 같은데 많은 도움이 되었어요 😊

Django Form Validation
출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..

내가 만든 예제코드

from django.core.validators import MinLengthValidator

def 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 들이 있다. 보고 활용을 하자.

Validators | Django documentation | Django

예제

from django.core.validators import MinLengthValidator

class GameUserSignupForm(forms.ModelForm):
    class Meta:
        model = GameUser
        fields = ['server','username']

    def clean_username(self): # 필드명에 clean_을 붙여서 각 필드별로 유효성 처리및 데이터 변경을 수행함
        return self.cleaned_data.get('username', '').strip()