기존 모델 클래스의 필드를 입력받는 폼이 있습니다.
이를 Model Form이라고 합니다.

그냥 form 만으로도 데이터를 받아서
Post에 레코드를 추가할 수 있지만,
이렇게 할 경우 Post에 속성이 추가되면
form도 그 때 그 때 수정해 주어야 하고
form으로 받은 데이터를 다시 꺼내서
모델 클래스의 인스턴스에 넣어주어야 하는 번거로움이 있습니다.

Django는 Model form을 제공하여 이 번거로움을 해결해줍니다.


1. 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 템플릿을 보면
다음과 같이 필드가 테이블의 행으로 정리된 모습을 볼 수 있습니다.

스크린샷, 2019-10-21 14-07-59.png