Django에서는 forms.Form
과 forms.ModelForm
이라는 두 가지 주요 폼 클래스를 제공합니다. 이 글에서는 두 클래스의 차이점과 각각의 사용 사례를 통해 어떤 상황에서 어떤 폼을 선택해야 할지 설명하겠습니다.
1. forms.Form
과 forms.ModelForm
의 개요

1.1 forms.Form
이란?
- 독립적인 폼 클래스: Django 모델과 무관하게 동작하며, 원하는 데이터를 수동으로 정의할 수 있습니다.
- 주요 용도: 사용자 입력을 받아 단순히 검증하거나, 모델과 직접 연관되지 않은 데이터를 처리할 때 사용됩니다.
예제: 사용자 피드백 폼
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="Your Name")
email = forms.EmailField(label="Your Email")
message = forms.CharField(widget=forms.Textarea, label="Your Feedback")
1.2 forms.ModelForm
이란?
- 모델과 연결된 폼 클래스: Django 모델과 직접적으로 연관되어 있으며, 데이터베이스와의 상호작용이 자동화됩니다.
- 주요 용도: 모델 인스턴스를 생성, 업데이트하거나, 데이터베이스에 저장할 데이터를 입력받을 때 사용됩니다.
예제: 블로그 글 작성 폼
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. 주요 차이점 비교
구분 | forms.Form | forms.ModelForm |
---|---|---|
모델과의 연관 | 모델과 무관 | 모델과 직접 연관 |
데이터 처리 | 데이터 검증 후 수동으로 저장 | 데이터를 자동으로 저장 (form.save() 메서드 사용) |
필드 정의 방식 | 모든 필드를 명시적으로 정의 | 모델의 필드를 자동으로 폼 필드로 변환 |
사용 용도 | 독립적인 데이터 처리나 사용자 입력 폼 | 데이터베이스 작업과 연결된 폼 |
유연성 | 자유롭게 필드 구성 가능 | 모델 필드에 종속적 |
3. 사용 사례
3.1 forms.Form
사용 사례
- 모델과 무관한 데이터 처리: 예: 검색 폼, 로그인 폼, 비밀번호 재설정 폼.
검색 폼 예제
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="Search")
- 복잡한 사용자 입력 처리: 예: 입력 필드가 모델에 직접 저장되지 않는 경우.
비밀번호 변경 폼 예제
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="Old Password")
new_password = forms.CharField(widget=forms.PasswordInput, label="New Password")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="Confirm Password")
def clean(self):
cleaned_data = super().clean()
new_password = cleaned_data.get("new_password")
confirm_password = cleaned_data.get("confirm_password")
if new_password != confirm_password:
raise forms.ValidationError("Passwords do not match.")
3.2 forms.ModelForm
사용 사례
- 모델 객체 생성 및 업데이트: 예: 블로그 글 작성, 댓글 작성, 사용자 프로필 수정.
댓글 작성 폼 예제
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- 모델 기반 데이터 입력: 예: 기존 데이터를 수정하거나 데이터베이스에 저장할 때.
4. 폼 동작 방식 비교
4.1 데이터 검증
forms.Form
: 수동으로 필드와 검증 로직을 정의.forms.ModelForm
: 모델 필드에 정의된 검증 규칙을 자동으로 사용.
예제: 모델 필드 검증
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price']
price
필드는 모델에 정의된 제약 조건(max_digits
,decimal_places
)을 자동으로 검증합니다.
4.2 데이터 저장
forms.Form
:cleaned_data
를 사용하여 데이터를 처리.forms.ModelForm
:save()
메서드로 데이터를 자동 저장.
forms.Form
데이터 저장 예제
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
feedback.save()
forms.ModelForm
데이터 저장 예제
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. 어떤 폼을 선택해야 할까?
- 모델과 연관된 작업: 데이터베이스와 직접 상호작용해야 한다면
forms.ModelForm
을 사용하는 것이 적합합니다. - 모델과 무관한 작업: 독립적인 데이터 검증이나 사용자 입력 처리가 필요하다면
forms.Form
을 사용하세요.
결론
forms.Form
과 forms.ModelForm
은 Django에서 데이터 입력과 검증을 처리하는 두 가지 강력한 도구입니다. 두 클래스는 용도와 특징이 다르므로, 상황에 맞는 폼을 선택하는 것이 중요합니다. 다음 글에서는 폼 필드와 위젯에 대해 자세히 살펴보겠습니다.
Add a New Comment