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을 자동 생성합니다. 데이터 저장 및 수정까지 간편하게 처리할 수 있습니다.