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() # 기존 인스턴스 업데이트