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

1. forms.Formforms.ModelForm의 개요

Comparison between forms.Form and forms.ModelForm in Django, highlighting differences like Model Association and Data Handling

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 사용 사례

  1. 모델과 무관한 데이터 처리: 예: 검색 폼, 로그인 폼, 비밀번호 재설정 폼.
검색 폼 예제
class SearchForm(forms.Form):
    query = forms.CharField(max_length=100, label="Search")
  1. 복잡한 사용자 입력 처리: 예: 입력 필드가 모델에 직접 저장되지 않는 경우.
비밀번호 변경 폼 예제
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 사용 사례

  1. 모델 객체 생성 및 업데이트: 예: 블로그 글 작성, 댓글 작성, 사용자 프로필 수정.
댓글 작성 폼 예제
class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'text']
  1. 모델 기반 데이터 입력: 예: 기존 데이터를 수정하거나 데이터베이스에 저장할 때.

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. 어떤 폼을 선택해야 할까?

  1. 모델과 연관된 작업: 데이터베이스와 직접 상호작용해야 한다면 forms.ModelForm을 사용하는 것이 적합합니다.
  2. 모델과 무관한 작업: 독립적인 데이터 검증이나 사용자 입력 처리가 필요하다면 forms.Form을 사용하세요.

결론

forms.Formforms.ModelForm은 Django에서 데이터 입력과 검증을 처리하는 두 가지 강력한 도구입니다. 두 클래스는 용도와 특징이 다르므로, 상황에 맞는 폼을 선택하는 것이 중요합니다. 다음 글에서는 폼 필드와 위젯에 대해 자세히 살펴보겠습니다.