개발일지/# Django
[Django] 폼을 간단하게, Model Form
lution88
2022. 4. 7. 20:19
Django의 ModelForm을 알아보자!
웹 서비스에서의 폼은 데이터베이스 기반으로.
즉, 모델을 기반으로 만드는 경우가 많습니다.
유저로부터 데이터를 입력받아서 데이터베이스에 저장하는 등의 로직이 많기 때문인데
DJango의 모델폼은 우리가 작성한 모델을 기반으로 자동으로 폼을 생성해 주는 기능이라고 할 수 있습니다.
모델 폼 만들어 보기.
기존 폼
# django의 forms를 import 한다.
from django import forms
class PostForm(forms.form):
title = forms.CharField(max_length=50, label='제목')
content = forms.CharField(label='내용', widget=forms.Textarea)
모델폼
# 모델 폼을 사용하기 위해서 forms.ModelForm 을 상속받고, 사용할 모델을 import 한다.
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
기존에 있던 title 과 content는 지워주고 Meta 클래스로 PostForm 클래스에 들어가는 옵션들을 설정해 줍니다.
Meta 클래스는 PostForm 클래스를 만들 때 적용할 여러 옵션을 넣어주는 클래스라고 생각하면 됩니다.
Post 모델을 보고 django가 폼을 생성하게 되고, Post 모델이 가지고 있는 필드 중 어떤 필드를 폼으로 만들 것인지를
fields 라는 변수에 리스트 형태로 넣어서 명시해 주면 각각의 폼 필드가 어떤 형식으로 작성되어야 하는지
모델에서 정의한 필드를 참고하여 django가 알아서 폼을 생성해주게 됩니다.
만약, 모델의 모든 필드를 폼으로 만들고 싶다면 fields = '__all__' 을 넣어주면 됩니다.
Views.py 에서도 ModelForm에 맞게 변경해 주기.
기존 views.py
def post_create(request):
if request.method == "POST":
title = request.POST['title']
content = request.POST['content']
new_post = Post(
title = title,
content = content
)
new_post.save()
return redirect('post-detail', post_id=new_post.id)
else:
post_form = PostForm()
return render(request, 'posts/post_form.html', {'form': post_form})
모델폼에 맞게 변경 후
def post_create(request):
if request.method == "POST":
post_form = PostForm(request.POST)
new_post = post_form.save()
return redirect('post-detail', post_id = new_post.id)
else:
post_form = PostForm()
return render(request, 'posts/post_form.html', {'form':post_form})
먼저 폼과 데이터를 바인딩 해 주고, 바인딩 된 내용을 save 해주면 데이터베이스에 저장할 수 있습니다.
모델폼이 가지고 있는 이 save 함수는 바운드 폼으로부터 가져온 데이터로 모델 인스턴스를 만들고
인스턴스를 데이터베이스에 처리하는 과정을 진행해 줍니다.
즉, save를 호출하면 데이터베이스에 데이터가 저장된다 라고 생각하시면 됩니다.
앞으로 모델을 기반으로 폼을 작성하는 경우. ModelForm을 사용하여 폼 생성부터 뷰 그리고 템플릿 까지 기능단위로
빠르고 편하게 구현할 수 있습니다!