수학과의 좌충우돌 프로그래밍

[Django] 12. form 을 알아보자 본문

웹프로그래밍/Django

[Django] 12. form 을 알아보자

ssung.k 2019. 2. 28. 01:33

안녕하세요 강민성입니다.


이번 시간에는 form 에 대해서 알아보겠습니다.


앞선 포스팅에서도 form을 다룬 적이 있습니다.


blog에 글을 쓰기 위한 form도 만들어 보았고, 회원가입, 로그인 하는 form도 만들어 보았습니다.


하지만 이 때는 단순히 html로 만들었었는데, 


장고에서는 모델과 대응시켜 이 form을 만들어 줄 수 있습니다.


이럴 경우, 보다 더 편하게 여러가지 기능을 추가할 수 있는데 이에 대해서 알아보도록 하겠습니다.



form을 이용해 입력공간 만들기



마찬가지로 blog project에서 이어서 진행하도록 하겠습니다.



먼저 form.py를 원하는 앱 안에 만들어줘야 합니다.


form의 위치는 중요하지 않지만 blog/models.py 의 class 를 불러올 것이기 때문에


편의상 이 위치에 만들어 주었습니다.


우선 django에서 구현되어있는 forms 와 models 에 있는 Blog 클래스 부터 import 해주었습니다.



이제 폼을 만들어주기 위해서는 class를 정의해주어야 합니다.


class 의 인자로 받는 형식은 두 가지인데 두 방식은 용도도 다릅니다.


모델을 기반으로 한 입력공간 만들기 : class BlogPost(forms.ModelForm):


임의의 입력공간 만들기 : class BlogPost(forms.Form):


이번에는 모델을 기반으로 한 입력 공간을 만들어보도록 하겠습니다.


Blog 모델 중에서 title 과 body를 입력받을 수 있는 공간을 만들겠다는 의미입니다.



이제 views 에서 함수를 다뤄줘야 할텐데


언제 함수를 실행할지 url 부터 건들고 가겠습니다.


9번째 줄에 blogpost 함수를 실행시키는 url을 만들어주었습니다.



views 로 넘어와서 form 부터 import 하고 가도록 하겠습니다.


form 에 있는 방금 만든 BlogPost를 import 해주었습니다.



본격적으로 blogpost 함수를 만들어보겠습니다.


blogpost 함수가 하는 역할은 두 가지 있습니다.


1. 입력된 내용을 처리해서 데이터베이스에 넣어주기


2. 처음 html로 들어갔을 때 빈 페이지를 띄워주기


blogpost 는 상황에 맞게 역할을 수행해야하는 게 그 구분점이 바로 


http 상에서 정보를 주고 받는 방식


입니다.


입력된 내용을 처리해서 데이터베이스에 넣어주는 건 데이터를 생성하는 것이므로 POST,


빈 페이지를 가져다주는 건 GET 방식일 겁니다.


이렇게 조건을 나누고 2. 처음 html로 들어갔을 때 빈 페이지를 띄워주기 부터 해보겠습니다.


BlogPost의 객체, 즉 비어있는 form을 html로 넘겨주기만 하면 됩니다.


지금까지의 코드는 다음과 같습니다. 



이제 1. 입력된 내용을 처리해서 데이터베이스에 넣어주기 를 해보겠습니다.


가져온 데이터 중 POST 방식으로 request 된 데이터를 form 라는 변수에 담아주었습니다.


다음으로는 입력이 잘 들어왔는지 검사를 합니다.


검사는 is_valid 함수로 입력 값이 잘 들어왔으면 true 아니면 false 를 반환합니다.


값이 잘 입력 되었을 경우에도 아직은 데이터를 저장해서는 안됩니다.


model에서는 title. pub_date, body 3개의 값을 필요로 하지만


form 에서는 title, body 2개의 값을 받아왔습니다.


따라서 모델 객체를 반환받되, 아직 저장을 해서는 안됩니다.


그럴 때 save 함수에 commit=False로서 해결해줍니다.


이 때 post는 Blog의 객체가 되어 각각의 맴버에 접근이 가능합니다.


따라서 pub_date 를 추가해주고 저장해주면 됩니다.


그 후 redirect 로 home으로 이동합니다.


* 이 때 BlogPost에 이미지 필드나 파일 필드가 있을 경우.


form = BlogPost(request.POST, request.FILES)




이제 화면에 띄워줄 new.html 을 만들어보겠습니다.


views 에서 넘겨준 form를 조금 다르게 사용하고 있습니다.


이처럼 form 뒤에 메소드를 추가해 form 안의 내용을 어떤 태그로 감싸서 출력할지 결정 가능합니다.


as_table, as_p , as_ul 등이 있습니다.



이제 블로그 글을 써보고 문제가 없는지 확인해보겠습니다.


다음과 같은 내용으로 글을 쓰면,

글이 추가된 걸 확인할 수 있고

body 공간을 비우고 제출하기를 누르면 경고메세지가 뜨면서 입력을 요구합니다.






프로젝트와는 상관 없지만 모델과 상관없는 임의의 입력공간 만드는 방법도 가볍게 알아보도록 합시다.


다양한 필드를 만들어주고 테스트 해본 결과,



모델과는 상관없는 다양한 form을 확인할 수 있습니다.




마무리



입이 아플 정도로 이 역시도 굉장히 요긴한 기능입니다.


우리가 회원가입을 할 때가 설문지를 작성할 때,


비어있는 문장을 없게 하려면 form.py 없이는 쉽지 않을 겁니다.


이렇게 편리한 기능들을 제공해주는 장고에 또 한 번 감탄하는 계기가 되었습니다.

Comments