Computer Science/Web

[Django] 장고 튜토리얼(4), 간단한 설문조사(Polls) 어플리케이션

hyunjin 2021. 5. 23. 00:47

투표 상세 템플릿(《polls/detail.html》)을 수정하여, 템플릿에 HTML <form> 요소를 포함

라디오 버튼의 value는 연관된 질문 선택 항목의 ID.

라디오 버튼 중 하나를 선택하면 choice=#를 보낸다. #은 선택한 항목의 id라고 한다.

 

폼의 동작을 {% url 'https:https' question.id %}(으)로 설정하고 method="post"로 설정합니다. method="post"를 사용하는 것은 매우 중요합니다(method="get"과 달리). 이 양식을 제출하면 데이터 서버측을 변경할 수 있기 때문입니다. 데이터 서버측을 변경하는 양식을 작성할 때마다 method="post"를 사용하십시오. 이 팁은 Django에만 국한된 것이 아닙니다. 일반적으로 웹 개발의 모범 사례입니다.

 

내부 URL을 대상으로 하는 모든 POST 형식은 {%csrf_token %} 템플릿 태그를 사용해야 함.

이 부분 추가함.

  • request.POST 는 키로 전송된 자료에 접근할 수 있도록 해주는 사전과 같은 객체. 이 경우, request.POST['choice'] 는 선택된 설문의 ID를 문자열로 반환합니다. request.POST 의 값은 항상 문자열.
  • 위의 코드는 KeyError 를 체크하고, choice가 주어지지 않은 경우에는 에러 메시지와 함께 설문조사 폼을 다시보여줍니다.
  • 설문지의 수가 증가한 이후에, 코드는 일반 HttpResponse 가 아닌 HttpResponseRedirect 를 반환하고, HttpResponseRedirect 는 하나의 인수를 받습니다: 그 인수는 사용자가 재전송될 URL 입니다.
  • 우리는 이 예제에서 HttpResponseRedirect 생성자 안에서 reverse() 함수를 사용하고 있습니다. 이 함수는 뷰 함수에서 URL을 하드코딩하지 않도록 도와줍니다. 제어를 전달하기 원하는 뷰의 이름을, URL패턴의 변수부분을 조합해서 해당 뷰를 가리킵니다. 여기서 우리는 튜토리얼 3장에서 설정했던 URLconf를 사용하였으며, 이 reverse() 호출은 아래와 같은 문자열을 반환할 것입니다.

'/polls/3/results/'

여기서 3 은 question.id 값

 

설문조사가 끝나고 난뒤에는 vote() 뷰는 설문조사 결과 페이지로 리다이렉트한다. 그 뷰를 작성해야한다.

 

polls/results.html 템플릿을 만든다.

 

 /polls/1/ 페이지로 가서, 투표를 해본다.

얼마나 투표했는지 알 수 있다.

성공 축축!!!


제너릭 뷰 사용하기: 적은 코드가 더 좋습니다.

  1. URLconf를 변환하십시오.
  2. 불필요한 오래된보기 중 일부를 삭제하십시오.
  3. Django의 제너릭 뷰를 기반으로 새로운 뷰를 도입하십시오.

urls.py를 수정했다.

뷰 수정하기

 index, detail, results뷰를 제거하고 장고의 일반적인 뷰를 대신 사용하겠습니다. 그렇게하려면 polls/views.py 파일을 열고 다음과 같이 변경하십시오:

다음과 같은 index뷰들 detail 뷰들, results뷰들을 제거하고 바꿔준다.

다음과 같이

후에 들어가면 전과 같이 뜨는 것을 볼 수 있었다.

 

4 끝!!

python3 manage.py runserver로 서버 생성하는거 잊지말기!

Ctrl + C쓰지말기 서버 만드는 그 공간에서 나와져버리니까