파이썬으로 장고(Django) 공략하기: 입문 강의를 정리한 내용입니다.
Model Form
- 장고의 ModelForm을 사용하여 기존 모델 클래스(Post)의 필드를 입력받는 장고 폼을 구현해보자.
- 장고 폼(PostForm)만으로 데이터를 받아서 Post로 레코드를 추가하게 되면, Post에 속성이 추가될 때마다 PostForm에도 추가를 해주어야하고, 넘어온 폼 데이터를 저장하려면 Post 모델 클래스의 인스턴스에 넣어주어야 하는 번거로움이 있다.
- 다음과 같이 선언하면 기존의 PostForm과 동일한 형태로 사용할 수 있다.
# second/forms.py
from django.forms import ModelForm
from second.models import Post
from django.utils.translation import gettext_lazy as _
# class PostForm(forms.Form): # django Form 클래스를 상속
# # label : 폼에서 텍스트로 보여지는 것을 설정
# title = forms.CharField(label="제목", max_length=200)
# content = forms.CharField(label="내용", widget=forms.Textarea)
class PostForm(ModelForm): # ModelForm을 상속
class Meta:
model = Post # 사용할 클래스
fields = ['title', 'content'] # 압력받을 필드, '__all__' 설정시 전체 필드 추가
labels = {
'title': _("제목"), # gettext_lazy는 "제목"이라는 텍스트를 가져오는 메소드
"content": _("내용"),
}
help_texts = {
'title': _("제목을 입력해주세요."),
"content": _("내용을 입력해주세요."),
}
error_message = {
"name": {
"max_length": _("제목이 너무 깁니다. 30자 이하로 작성해주세요.")
}
}
- {{ form }} 대신 {{ form.as_table }}을 사용한다.
<!-- second/templates/second/create.html -->
<form action="{% url 'confirm' %}" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">제출</button>
</form>
Model Form으로 데이터 저장
- create 메소드에 GET 요청인 경우 create 페이지를 조회하고, POST 요청인 경우 데이터를 저장하도록 요청 메소드에 따라 구분해서 처리해보자.
# second/views.py
def create(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
new_item = form.save() # POST로 넘어온 폼 데이터를 저장
return HttpResponseRedirect('/second/list/')
form = PostForm()
return render(request, 'second/create.html', { 'form': form })
- 요청 url을 create로 변경한다.
<!-- second/templates/second/create.html -->
<form action="{% url 'create' %}" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">제출</button>
</form>