Post

Django: Form과 ModelForm

Django Form과 ModelForm을 사용하여 효율적으로 폼을 생성하고 유효성 검사를 처리하는 방법

Django: Form과 ModelForm

Django 개발을 하다 보면 Form을 반복적으로 구현해야 하는 경우가 많습니다. 이런 작업을 간소화하고 유효성 검사까지 처리할 수 있는 Django Form Class를 소개합니다.

Form Class 선언하기

Django의 forms 모듈을 사용하여 Form Class를 정의할 수 있습니다. 다음은 간단한 Form Class의 예제입니다:

1
2
3
4
5
from django import forms

class ArticleForm(forms.Form):
    title = forms.CharField(max_length=10)
    content = forms.CharField()

여기서 CharField는 입력 필드의 데이터 형식과 제한 조건을 정의합니다. 마치 Django의 Model을 정의하는 것과 비슷한 방식입니다.

Form을 템플릿에 적용하기

Form Class를 템플릿에서 사용하려면 View에서 Form 객체를 생성하고 템플릿에 전달해야 합니다.

articles/views.py

1
2
3
4
5
6
7
8
from .forms import ArticleForm

def new(request):
    form = ArticleForm()
    context = {
        "form": form,
    }
    return render(request, "new.html", context)

articles/new.html

1
2
3
4
5
6
7
<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

{{ form.as_p }}를 사용하면 Form 필드가 <p> 태그로 감싸져 렌더링됩니다. as_p, as_table, as_ul 등 다양한 렌더링 옵션을 사용할 수 있습니다.

ChoiceField 사용하기

Form에서 선택지를 제공하고 싶다면 ChoiceField를 사용할 수 있습니다:

articles/forms.py

1
2
3
4
5
6
7
8
9
10
11
12
from django import forms

class ArticleForm(forms.Form):
    GENRE_CHOICES = [
        ("technology", "Technology"),
        ("life", "Life"),
        ("hobby", "Hobby"),
    ]

    title = forms.CharField(max_length=10)
    content = forms.CharField(widget=forms.Textarea)
    genre = forms.ChoiceField(choices=GENRE_CHOICES)

ChoiceField를 사용하면 GENRE_CHOICES로 정의한 값 중 하나를 선택할 수 있는 드롭다운 메뉴가 생성됩니다.

유효성 검사와 반복 작업 감소

Form Class는 유효성 검사를 자동으로 처리합니다. 예를 들어, CharField(max_length=10)는 최대 입력 길이를 10자로 제한합니다. Django는 Form 데이터를 유효성 검사한 뒤, 유효하지 않은 입력이 있다면 오류 메시지를 제공합니다.

Form Class를 사용하면 Form과 View에서 중복되는 작업을 줄이고, 유지보수가 간편해집니다.

Django ModelForm Class: 더 편리한 Form 생성

Django의 ModelForm Class는 Model을 기반으로 Form을 자동 생성하는 강력한 도구입니다. Model과 Form 간의 중복 정의를 줄일 수 있습니다.

ModelForm Class 선언하기

ModelForm은 다음과 같이 선언할 수 있습니다:

articles/forms.py

1
2
3
4
5
6
7
8
from django import forms
from articles.models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"
        # exclude = ["title"]  # 특정 필드를 제외하고 싶을 때 사용

Meta 클래스에서 ModelForm이 참조할 모델(model)과 Form으로 사용할 필드(fields)를 정의합니다.

View에서 ModelForm 사용하기

ModelForm을 활용하여 데이터를 처리하는 예제입니다:

articles/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from .forms import ArticleForm
from django.shortcuts import redirect

def create(request):
    if request.method == "POST":
        form = ArticleForm(request.POST)
        if form.is_valid():
            article = form.save()  # Model 인스턴스 저장
            return redirect("article_detail", article.id)
    else:
        form = ArticleForm()

    context = {"form": form}
    return render(request, "create.html", context)

form.save()는 Form 데이터를 저장하고 해당 객체를 반환합니다. request.method에 따라 비어 있는 Form을 보여주거나 데이터를 처리할 수 있습니다.

Update View 구현하기

ModelForm은 기존 데이터를 수정할 때도 사용할 수 있습니다. instance 매개변수를 활용하여 기존 데이터를 Form에 채웁니다:

articles/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.shortcuts import get_object_or_404

def update(request, pk):
    article = get_object_or_404(Article, pk=pk)
    if request.method == "POST":
        form = ArticleForm(request.POST, instance=article)
        if form.is_valid():
            article = form.save()
            return redirect("article_detail", article.id)
    else:
        form = ArticleForm(instance=article)

    context = {
        "form": form,
        "article": article,
    }
    return render(request, "update.html", context)

instance를 지정하면 기존 객체를 수정하고, 지정하지 않으면 새 객체를 생성합니다.

정리

  • Form Class: 데이터를 입력받고 유효성 검사를 수행합니다. 반복 작업을 줄이고 간결한 코드를 작성할 수 있습니다.
  • ModelForm Class: Model을 참조하여 Form을 자동 생성합니다. 데이터 저장 및 수정까지 간편하게 처리할 수 있습니다.
This post is licensed under CC BY 4.0 by the author.