지금 까지만든 설문지페이지에서 오늘은 form을 작성해 볼 것이다.

 HTML에서 form은 데이터를 전달 하는 기능을 한다.
우리는 설문지에서 설문 선택지를 선택하고 버튼을 클릭하면 선택한 선택지의 정보를 담아서 웹 페이지에 전달할 것이다.

이 내용은 DB에 저장될 것이므로, POST 방식으로 보내게 할 것이다.


(detail.html)


detail.html 템플릿은 question 객체를 받는다.
받은 question 객체에서 질문 내용인 question_text를 h1 태그로 찍어준다.

그리고 에러메시지가 있으면 해당 에러 내용을 출력해준다.

그 다음 부터는 form 태그이다.
그런데 중간에 csrf 토큰이 보일 것이다. 우리는 form 을 사용하여 데이터를 전달할 것이기 때문에 CSRF 공격에 대해 생각하고 있어야한다. 장고에서 대신 CSRF 공격에 대해 예방하는 기능이 있는데
{% csrf_token %} 만 작성하면 된다. (나중에도 form 문에는 이 문구를 적어넣어야한다. )
해당 question객체에서 선택지들을 전부 가져온 후 for 문을 돌면서 radio 버튼과 선택지 내용을 출력한다.

웹페이지를 실행시켜서 직접 확인해보자!



(form 페이지)


질문 내용이 위에 찍혀있고 선택지들이 버튼과 함께 나열되어있는 것을 볼 수 있다.

위에 form 코드를 다시 보면 url vote로 이동하라고 action에 나와있다.

url vote는 우리가 작성한 polls/urls.py를 확인하면 알 수 있다.


(vote)


vote이름을 가진 주소패턴에 해당 question.id가 조합이 되면 어떤 주소가 된다.
보면 views.vote를 실행하게 되어있다.

그렇다면 views.vote를 작성해주자!


(views.vote)


우리는 question_id를 주소에서 전달받게 된다. 전달 받은 question_id를 pk로 사용하여 해당 질문 객체를 가져온다.
그 후 선택된 선택지를 가져오는데 request객체 안에 POST에 담겨있다. 우리가 POST로 전달했기 때문이다. POST 속에 choice=### 이런식으로 담겨온다. choice변수에 담긴 값을 pk로 선택된 질문을 가져온다. 그 후 선택된 질문객체에서 투표수를 1 증가시키고 저장한다.
그리고 Redirect한다. reverse를 사용해서 url 주소를 만든다.
polls 이름 영역의 urls.py에 정의 되어있는 results 이름의 주소 패턴을 가져오고 인자로 question.id를 조합하여 특정 url을 만드는 것이다. 그 주소로 리다이렉트한다.

그렇다면 처리된 결과를 확인하는 results의 화면도 만들어보자.


(views.results)


위에서 리다이렉트된 주소는 views.results를 호출한다. polls/urls.py를 확인하면 알 수 있다.
이 뷰에서는 질문 객체를 가져오고 이 질문 객체를 가지고 polls/results.html 템플릿을 보여준다.

보여주는 results.html 템플릿은 아래와 같다.


(results.html)


질문 객체에서 각각의 선택 내용과 투표수를 출력하는 템플릿이다.

실행해서 확인해보자.



(실행 확인)


확인해보니 잘 된다!

질문 객체를 가져오고, 질문 객체를 가지고 템플릿으로 전달하고 등등
어떻게 보면 이것 또한 루틴한 작업이다.
그래서 이번에는 제네릭 뷰를 이용해서 위의 페이지를 똑같이 만들어 볼 것이다.

제네릭 뷰에는 리스트뷰와 디테일뷰가 있다.
리스트뷰는 말 그대로 리스트들을 보여주는데 사용하고
디테일뷰는 우리가 detail view를 만들었던거와 같다.

먼저 제네릭뷰를 사용하기 전에 polls/urls.py를 수정해줘야한다.


(polls/urls.py)


제네릭뷰에서는 pk로 전달 받기 때문에 pk로 바꾸어 주었다.
그리고 호출하는 것이 각각의 뷰에서 as_view() 함수를 호출한다.
우리는 views에 위에서 사용한 클래스를 만들어줘야한다.

이어서 view를 수정해 줄 것이다. 제네릭 뷰를 이용해 수정한 코드는 아래와 같다.


(제네릭 뷰)


각각의 클래스를 만들었다.
template_name은 우리가 사용할 템플릿 위치를 알려준다.
그리고 model은 어떤 모델이 적용될 것인지 지정해주는 것이다.
DetailView의 경우 question 변수가 자동으로 제공된다. 그러나 ListView의 경우 자동 생성된 컨텍스트변수는 question_list이기 때문에 우리가 템플릿에서 사용했던 변수 이름으로 맞춰주기 위해 context_object_name의 변수로 지정해주었다.

ListView에서 get_queryset을 가지고 쿼리를 날리는데 우리는 최근 5개 글을 볼것이므로 해당 함수를 덮어쓴 것이다.

실행해서 웹페이지에서 똑같은 동작인지 확인해보자



(동작 확인)


같은 동작을 하는 것을 확인 할 수 있다.

(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial04/)

'Web > Django Project' 카테고리의 다른 글

Simple SignUp  (1) 2018.07.25
Simple Login/Logout  (0) 2018.07.24
Django Tutorial - Views ( Template와 연결 )  (0) 2018.02.01
Django Tutorial - 관리자 생성 및 페이지보기  (0) 2018.01.31
Django Tutorial - Model  (0) 2018.01.31

+ Recent posts