기존 모델 클래스의 필드를 입력받는 폼이 있습니다.
이를 Model Form이라고 합니다.
그냥 form 만으로도 데이터를 받아서
Post에 레코드를 추가할 수 있지만,
이렇게 할 경우 Post에 속성이 추가되면
form도 그 때 그 때 수정해 주어야 하고
form으로 받은 데이터를 다시 꺼내서
모델 클래스의 인스턴스에 넣어주어야 하는 번거로움이 있습니다.
Django는 Model form을 제공하여 이 번거로움을 해결해줍니다.
기존의 form형태가 아닌 models.py에서 정의해준 model을 가져다 쓰는
Model Form으로 구현해보겠습니다.
#second/forms.py
# from django import forms
from django.forms import ModelForm
from second.models import Post
# class PostForm(forms.Form): # django의 폼을 상속
# title = forms.CharField(label='제목', max_length=200)
# content = forms.CharField(label="내용", widget=forms.Textarea)
class PostForm(ModelForm):
class Meta:
model = Post # 어떤 모델 클래스를 사용할 것인지
fields = ['title', 'content'] # 입력받을 필드들
전에 만들어 준것과 비교해보면 확실히 간편합니다.
Model에 이미 정의한 형식을 가져다 쓰기 때문입니다.
하지만, label 설정이 빠졌습니다.
form의 label과 더불어 몇가지 더 알아보도록 하겠습니다.
#second/forms.py
from django.utils.translation import gettext_lazt as _
class PostForm(ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
labels = {
'title': _('제목'),
'content': _('내용'),
}
help_texts = {
'title': _('제목을 입력해주세요.'),
'content': _('내용을 입력해주세요.'),
}
error_messages = {
'name': {
'max_length': _("제목이 너무 깁니다. 30자 이하로 해주세요."),
},
}
일단 지금은 이렇게 하면 되는구나 정도로 넘어가고 다음에 더 자세히 다루도록 하겠습니다.
#second/create.html
<form action="{% url 'confirm' %}" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">제출</button>
</form>
form data를 그냥 렌더링 하지 않고
form.as_table로 불러오면
각 필드가 테이블 행으로 렌더링됩니다.
runserver를 해서 create 템플릿을 보면
다음과 같이 필드가 테이블의 행으로 정리된 모습을 볼 수 있습니다.