Django Form 컴포넌트 활용 가이드

1. 기본 개념과 필요성

사용자 입력 데이터의 유효성 검증, 폼 렌더링, 오류 메시지 표시 등의 기능을 자동화하기 위해 Django의 Form 컴포넌트를 사용할 수 있습니다. 기존에 수작업으로 작성해야 했던 폼 생성 및 검증 로직을 간소화할 수 있습니다.

2. Form 클래스 정의

폼은 django.forms.Form를 상속받아 정의합니다. 각 필드는 해당 타입에 맞는 필드 클래스로 지정하며, 유효성 조건을 설정할 수 있습니다.

from django import forms

class UserRegistrationForm(forms.Form):
    username = forms.CharField(
        min_length=3,
        max_length=15,
        label='사용자명'
    )
    age = forms.IntegerField(
        min_value=18,
        max_value=100,
        label='나이'
    )
    email = forms.EmailField(label='이메일')

3. 데이터 검증 프로세스

폼 객체 생성 시 전달된 데이터를 검증하는 과정은 다음과 같습니다:

  • is_valid(): 모든 필드가 유효한지 확인
  • cleaned_data: 유효한 데이터를 딕셔너리 형태로 반환
  • errors: 유효하지 않은 필드와 오류 메시지를 포함한 딕셔너리
form = UserRegistrationForm(request.POST)
if form.is_valid():
    print(form.cleaned_data)  # {'username': 'john', 'age': 25, ...}
else:
    print(form.errors)  # {'username': ['최소 3자 이상 필요']} 

4. HTML 렌더링 방식

폼 필드를 다양한 형식으로 렌더링할 수 있습니다:

  • {{ form.as_p }}: 각 필드를 <p> 태그로 감싸기
  • {{ form.as_ul }}: <li> 리스트로 표현
  • {{ form.as_table }}: <table> 형식으로 정렬
<form method="post">
    {{ form.as_p }}
    <button type="submit">제출</button>
</form>

5. 커스텀 오류 메시지 설정

필드별 오류 메시지를 직접 정의할 수 있습니다.

username = forms.CharField(
    min_length=3,
    error_messages={
        'min_length': '사용자명은 최소 3자 이상이어야 합니다.',
        'required': '필수 항목입니다.'
    }
)

6. 훅 함수 사용

특정 필드 또는 전체 폼에 대해 추가 검증 로직을 삽입할 수 있습니다.

6.1 지역 훅 (Local Hook)

특정 필드에 대한 고유 검증을 수행합니다.

def clean_username(self):
    username = self.cleaned_data.get('username')
    if User.objects.filter(username=username).exists():
        raise ValidationError('이미 존재하는 사용자명입니다.')
    return username

6.2 전역 훅 (Global Hook)

여러 필드 간의 관계를 검증할 때 사용합니다.

def clean(self):
    password = self.cleaned_data.get('password')
    confirm = self.cleaned_data.get('confirm_password')
    if password != confirm:
        self.add_error('confirm_password', '비밀번호가 일치하지 않습니다.')
    return self.cleaned_data

7. 위젯(Widget) 및 스타일링

HTML 요소의 렌더링 방식을 제어하기 위해 위젯을 사용합니다.

name = forms.CharField(
    widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '이름 입력'})
)

city = forms.ChoiceField(
    choices=[(1, '서울'), (2, '부산')],
    widget=forms.widgets.RadioSelect()
)

8. ModelForm: 모델 기반 폼 생성

ORM 모델과 연결된 폼을 자동으로 생성할 수 있습니다.

from django.forms import ModelForm
from .models import User

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = '__all__'
        labels = {'name': '사용자 이름'}
        widgets = {'name': forms.TextInput(attrs={'class': 'form-control'})}

9. CRUD 연동 예제

ModelForm을 통해 데이터 생성, 수정, 삭제를 간편하게 처리할 수 있습니다.

# 데이터 생성
if form.is_valid():
    form.save()  # DB에 저장

# 데이터 수정
obj = User.objects.get(pk=1)
form = UserForm(request.POST, instance=obj)
if form.is_valid():
    form.save()  # 기존 인스턴스 업데이트

태그: Django Form ModelForm validation widget

6월 10일 01:00에 게시됨