[Django] - 8. ModelForm 사용하기

최창우·2022년 9월 8일
0

Django

목록 보기
9/10
post-thumbnail

📜 ModelForm 사용하는법을 알아보자.

📕 ModelForm 사용하기

📖 ModelForm 이란?

앞서 했던 것처럼, form.py에 입력받을 데이터를 일일이 지정해도되지만, 번거로움
ModelForm은 사용할 모델을 가져와서, 모델에서 정의한 필드대로 form을 자동으로 만들어주는 기능
사용자로부터 데이터를 입력받아서 저장할 때는 대부분 ModelForm을 사용

장점

  • 폼을 위한 HTML을 작성할 필요 없음 (???)
  • 데이터 유효성 자동으로 검사
  • 올바르지 않은 데이터를 입력했을 경우 에러메시지와 함께 사용자에게 알려줌
  • 재사용가능

📖 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>
profile
유능한 개발자가 되고 싶은 헬린이

0개의 댓글