HTML에서 form은 데이터를 전달 하는 기능을 한다.
우리는 설문지에서 설문 선택지를 선택하고 버튼을 클릭하면 선택한 선택지의 정보를 담아서 웹 페이지에 전달할 것이다.
이 내용은 DB에 저장될 것이므로, POST 방식으로 보내게 할 것이다.
(detail.html)
받은 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)
보면 views.vote를 실행하게 되어있다.
그렇다면 views.vote를 작성해주자!
(views.vote)
그 후 선택된 선택지를 가져오는데 request객체 안에 POST에 담겨있다. 우리가 POST로 전달했기 때문이다. POST 속에 choice=### 이런식으로 담겨온다. choice변수에 담긴 값을 pk로 선택된 질문을 가져온다. 그 후 선택된 질문객체에서 투표수를 1 증가시키고 저장한다.
그리고 Redirect한다. reverse를 사용해서 url 주소를 만든다.
polls 이름 영역의 urls.py에 정의 되어있는 results 이름의 주소 패턴을 가져오고 인자로 question.id를 조합하여 특정 url을 만드는 것이다. 그 주소로 리다이렉트한다.
그렇다면 처리된 결과를 확인하는 results의 화면도 만들어보자.
(views.results)
이 뷰에서는 질문 객체를 가져오고 이 질문 객체를 가지고 polls/results.html 템플릿을 보여준다.
보여주는 results.html 템플릿은 아래와 같다.
(results.html)
실행해서 확인해보자.
(실행 확인)
질문 객체를 가져오고, 질문 객체를 가지고 템플릿으로 전달하고 등등
어떻게 보면 이것 또한 루틴한 작업이다.
그래서 이번에는 제네릭 뷰를 이용해서 위의 페이지를 똑같이 만들어 볼 것이다.
제네릭 뷰에는 리스트뷰와 디테일뷰가 있다.
리스트뷰는 말 그대로 리스트들을 보여주는데 사용하고
디테일뷰는 우리가 detail view를 만들었던거와 같다.
먼저 제네릭뷰를 사용하기 전에 polls/urls.py를 수정해줘야한다.
(polls/urls.py)
그리고 호출하는 것이 각각의 뷰에서 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 |