앞서 했던 것처럼, form.py에 입력받을 데이터를 일일이 지정해도되지만, 번거로움
ModelForm은 사용할 모델을 가져와서, 모델에서 정의한 필드대로 form을 자동으로 만들어주는 기능
사용자로부터 데이터를 입력받아서 저장할 때는 대부분 ModelForm을 사용
장점
app_2th/forms.py
class Write_Form(forms.ModelForm):
class Meta:
model = Person # 사용할 모델 (해당 모델에 정의된 필드들이 자동으로 설정된다.)
fields = ["first_name","last_name"] # all 할경우 모델에 정의된 필드 전부 받음
# 입력창옆에 나타나는 레이블
labels = {
'first_name':('이름'),
'last_name':('성'),
}
# 입력창 아래에 나타나는 설명창
help_texts = {
'first_name':('이름을 영어로 입력해주세요.'),
'last_name':('성을 영어로 입력해주세요.')
}
# 에러날시 적용되는 에러메시지
error_messages = {
'name':{
'max_length':'30자 이하로 작성바랍니다.'
}
}
app_2th/write.html (ModelForm과 관련없지만, 깔끔하게 보이게끔 변경)
<form action="{% url 'result' %}" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">제출</button>
</form>
write 실행결과화면
/write/ 페이지에 접속했을시는 기본 request 옵션이 GET이라, if문을 넘어서
form 화면을 보여주는 기능만한다.
하지만 이름과 성을 작성 후 제출 버튼을 누르면, write.html에서 action url이
/write/이므로 다시 POST 요청으로 들어와서 입력받은 데이터들을 저장한 후, person경로로 이동.
app_2th/views.py
def write(request):
# /write/ 페이지에서 "이름"작성한뒤 제출누르면 write.html에서 다시 /write/로 post 요청보냄
if request.method == "POST":
form = Write_Form(request.POST)
if form.is_valid():
new_item = form.save() # 입력받은 데이터를 저장
return HttpResponseRedirect('/person/')
# /write/ 페이지 접속했을시, form 화면 보여줌.
form = Write_Form()
context = {
'form':form
}
return render(request,'write.html',context)
app_2th/templates/write.html
<form action="{% url 'write' %}" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">제출</button>
</form>