Django 프론트& 백엔드 개발

Django Form에서 유효성 검증

Data Jun 2026. 1. 11. 14:13

Django에서 데이터를 처리할 때 가장 중요한 것 중 하나는 유효성 검증입니다.
사용자 입력을 그대로 신뢰할 수 없기 때문에,
저장 전에 값이 올바른지 반드시 확인해야 합니다.

 

Django는 이를 위해 Form과 Model 각각에서 유효성 검증을 수행할 수 있는 구조를 제공합니다.
이번 글에서는 Form에서의 검증 방법, Model과의 차이,
그리고 두 방식을 함께 사용할 때 검증이 어떤 순서로 이루어지는지를 예제를 통해 정리해보겠습니다.

 

1. Form에서 Model과 무관한 데이터 검증하기

Model과 직접 연결되지 않은 데이터를 Form에서 검증하는 예시입니다.

memo = forms.CharField(
    max_length=80,
    validators=[validate_symbols]
)

DB에 저장하지 않는 사용자 입력 경우 Model이 없기 때문에 Form에서 직접 validator를 지정해 유효성을 검사합니다.

 

2. ModelForm에서 개별 필드 검증하기 (clean_<field>)

ModelForm에서 특정 필드만 따로 검증하는 예시입니다.

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:
        # Post Model을 활용해서 Form을 만드는 Meta 클래스: Form 자동 생성
        model = Post
        fields = ['title', 'content']

    def clean_title(self):
         # clean_title 함수의 경우 하나의 데이터를 검증할 수 있고 무조건 해당 데이터를 return해서 넘겨줘야 함.
         # cleaned_data: form에 입력된 데이터(model의 유효성 검증을 하지 않은 데이터.)
         title = self.cleaned_data['title']
         if '*' in title:
            raise ValidationError("*는 포함될 수 없습니다.")
         
         return title
  • clean_<field>는 검증 + 값 반환 역할
  • 반환된 값이 cleaned_data에 다시 저장됨
  • return을 하지 않으면 값이 사라짐 ❌

clean_<필드명>() 메서드는 해당 필드 하나만 검증할 때 사용하는 공식적인 방법입니다.

 

 

3. Model Validator vs Form Validator 차이

구분 Model Validator Form Validator
적용 위치 Model 필드 Form 필드
실행 시점 DB 저장 직전 Form 유효성 검사 시
재사용성 높음 해당 Form에서만
목적 데이터 무결성 보장 사용자 입력 검증 

Model 검증:  “DB에 들어가는 데이터는 무조건 안전해야 한다”

Form 검증: “사용자 입력을 어떻게 받을지 제어한다”

 

4. Form과 Model 검증을 같이 쓰면 실행 순서는?

실제 검증 순서는 다음과 같습니다.

 

1️⃣ Form 필드 validator 실행
2️⃣ clean_<field>() 실행
3️⃣ clean() 실행 (있다면)
4️⃣ Model 필드 validator 실행
5️⃣ Model clean() 실행 (있다면)
6️⃣ DB 저장

 

즉, Form 검증이 먼저, Model 검증은 최종 방어선 역할을 합니다.

 

5. 정리하면

Django의 유효성 검증은 Form과 Model로 역할이 명확히 나뉘어 있음

Form은 사용자 입력을 다듬는 단계

Model은 데이터 무결성을 지키는 최종 단계

두 가지를 함께 사용하면 안정성과 유연성을 모두 잡을 수 있음