001, 002, 003에 이어서 이번에는 004 submit form입니다. 


결론적으로는 잘 까먹는 저를 위해서 작성해두는 포스팅이구요.

혹시라도 읽고 계시는 분이라면 순서대로 읽고 계시다고 가정하고 내용을 정리합니다. 


앞선 포스팅에서 생성한 프로젝트 및 앱의 구조는 아래와 같슴다. 


../formstest/
                  ┣ manage.py
                  ┗ formstest/
                  ┃                ┣ __init__.py
                  ┃                ┣ settings.py
                  ┃                ┣ urls.py
                  ┃                ┗ wsgi.py
                  ┃                

                  ┗formstestapp/                

                                     ┣ static (folder)

                                     ┣ template (folder) -- formstest.html

                                     ┣ __init__.py

                                     ┣ admin.py

                                     ┣ models.py

                                     ┣ tests.py

                                      views.py

                                      forms.py


이번 포스팅에서 정리해둘 내용은 만들어진 form에서 submit이 눌렸을 때 django 쪽에서 값을 파싱하는 부분입니다. 


1.  template 파일 확인


지금 사용하고 있는 template 파일은 formstest.html 입니다.

이 파일은 현재 다음 그림과 같이 작성되어 있죠.

action 부분에 /formstestapp/form_request 라고 작성되어 있습니다.

이곳으로 데이터가 날라갈 예정입니다. 


그럼 urls.py -> views.py -> models.py  이런식으로 작업을 할 수 있을 것 같네요.



2. 좀 더 스마트한 녀석으로 변경하기


지금까지 작성한 내용대로 해도 관계 없지만, 이곳 저곳 왔다갔다 해야 하는 불편함이 있습니다. 

Django에서는 form 관련해서 좋은 view 클래스를 제공하고 있습니다. 

좀 더 스마트한 form을 작성하기 위해서 기존 녀셕들을 좀 변경해보겠습니다. 


일단 views.py를 다음과 같이 변경합니다. 

기존 views.py에서 많이 변경되었는데요.

class로 변경했습니다. FormView라는 것을 사용했구요.

이 FormView 클래스를 사용하면 여러 내장 함수를 통해 Form에 대한 검사나 예외를 처리하기 수월해집니다.


FormView에는 3개 변수를 정의해줘야 하는데 

template_name은 이름과 같이 template 파일 이름을 지정합니다.

success_url은 form이 정상적으로 처리되었을 때 이동할 url이 됩니다.

form_class는 template에 시각화할 form 클래스를 의미합니다.


또한 위에 작성한 1번과 같은 방법이 아니고, 좀 더 개발자가 명확하게 파악이 가능한 구조가 됩니다. 


views.py가 변경되었으니 views.py를 불러주는 urls.py도 변경합니다. 


다음은 forms.py도 변경하겠습니다. 

함수 하나를 추가했는데요. submitted입니다. views.py에서 form_valid(....) 함수에서 연결되어 불려지는 부분으로

template에 존재하는 form이 정상적으로 입력되어  submit 버튼이 눌렸을 때 처리하는 내용을 담고 있습니다.

여기서는 단순하게 print 문만 작성했지만 실제로는 models.py와 연계해서 데이터베이스 처리라던지 등을 수행하도록 작성할 수 있습니다.


마지막으로 template 파일도 변경합니다.

변경된 template에서는 action이 비어있습니다. 

FormView의 함수들을 활용하는 방법이 됩니다.

중간에 있는 {% csrf_token %} 은 django에서 기본적으로 제공하는 보안 방법이라고 생각하시면 됩니다.

개발자가 처리해둔 경로가 아닌 곳에서의 요청을 막아줍니다. 



3. runserver 및 테스트


runserver 후 웹 페이지에 접속해보면 다음과 같습니다.  왼쪽은 웹 페이지, SUBMIT BUTTON을 누르면 찍히는 print 문입니다. 

 


하지만 곧 에러 페이지를 만나게됩니다. 

views.py에서 정의한 success_url 이 urls.py에서 찾을 수 없기 때문입니다.

요건 urls.py에 추가해주고 views.py에 보여질 부분을 처리하면 됩니다.


아무튼 테스트까지 끝. 

모든 소스는 다음 URL에서 확인할 수 있슴다.  https://github.com/motobyus/moto/tree/master/djangoFormsTest/004_submitForm/formstest


005에서는 여러 field를 사용해보는 것을 목표로 해보려고 합니다.

004까지해서 Forms에 대해서 허접한 정리였슴다. ㅠ 


구글에서 참고하실 수 있는 Django 페이지가 많이 존재하니깐 그것을 꼭 확인하셔요.


+ Recent posts