대기업도 사용하는 인터넷 설문조사 만들기 사이트 리스토베이로 시작!
본문
저번시간에 설문조사 사이트 장고프레임워크로데이터를 다루는 방법을 알아보았다오늘은 조금 더 많은 기능을 활용해설문조사 사이트를 만들어보자앱 이름은 vote로 만들에정이다Vote에서 index.html로 들어온다면투표 가능한 리스트를 보여줄것이다그리고 투표 가능한 리스트 중 하나를 누르면투표 가능 목록이 보이게 되며투표를 할 수 있게 구현할것이다마지막으로 투표를 하고 나면결과 화면을 보여줄것이다먼저 view와 Template의 경우서로에게 영향을 미치기 때문에데이터베이스인 모델작업 먼저하는 게 좋다설문조사를 하는 앱이기 때문에각 데이터들은 NULL값이 없도록 설정하며질문을 저장하는 테이블과답변을 선택하고 답변 개수를 저장하는 테이블 두 개를 만들거다django-admin startapp votevote앱을 생성 후앱을 등록하러config에 settings.py로 가자그리고 모델먼저 생성을 하기로 했으니모델을 정의하러 vote에 mdoels.py로 가자이런식의 관계가 되는 테이블이 만들어지는것이다어드민 사이트에 등록하러vote에 admin.py로 가자참고로 modes.Model인데modes.Models 이렇게 입력하면AttributeError: module 'django.db.models'has no attribute 'Models'이런 설문조사 사이트 오류가 발생할 수 있으니 잘 보자이제 앱을 최종적으로DB에 등록을 시키자myhome\Scripts\activate앱을 활성화 한다음python manage.py makemigrationspython manage.py migrate DB서버에 등록하자이제 서버를 실행시키고질문과 답변사항을 작성하자python manage.py runserver질문과 답변들을 추가를 하자그런데 이렇게 각 테이블의 id 값으로데이터를 식별하기에는 많이 복잡하다 때문에 모델로 가서 오버라이딩을 통해쉽게 알아볼 수 있도록 하자이렇게 보기 좋게데이터를 구분할 수 있게 되었다이제 URL과 Templat을 구현해보자URL과 views Template는이런 구조로 만들어줄거다기본 로컬주소에/vote의 URL처리가 들어오면 index에서vote/pk 즉 Question Table의 id값으로 들어오면 detailevote/pk/vote는 Vote 후 vote/pk/result로vote/pk/result는 Result처리를 할 예정이다config 의 urls.py가자계층화 작업을 위하여로컬주소 및 /vote URL로 접속시vote 앱에서 처리할 수 있게 경로를 추가한다다만 장고프레임워크에서 앱을 만들면기본값으로 ruls.py가 없다그렇기에 vote에 urls.py는 없어서새파일을 생성하여 설문조사 사이트 만들어 준다생성을 했으면url 패턴을 추가해주자url 패턴에 name을 추가한 이유는추후 template에서 작업을 할시구분을 하기 위해서이다구별을 해주는 게 좋다이제 url패턴에서 만든 함수들을views에서 실제로 만들러 가자index.html에서 질문 리스트를띄위기 위하여 데이터를 가져오기 위한 작업이다아직 나머지 함수들은 추후 구현을 할 예정이기에 pass로 처리한다먼저 index를 처리할건데object.all()을 통해 데이터를 가져왔다장고프레임워크에서 기본으로 제공하는 render는views와 html을 매핑시키는 작업을 하고데이터를 전달하는 역할도 한다다만 render로 데이터를 전달하기 위해서는딕셔너리 형식으로 넘거가야 하기 때문에context라는 딕셔너리를 만들어 전달했다이제부터는 templates 분리를 진행해야한다장고 프레임워크의 templates의 기본 경로는현재 디렉토리이다그런데 현재 디렉토리에서처리를 한다면여러 앱을 동시에 만들었을 때index.html 처럼 이름이 겹치는 경로가 생겨나게 된다이를 방지하고자 앱 이름의파일을 만들어 앱마다 경로를 따로 지정해주는 게 좋다config에 setting.py로 설문조사 사이트 가자앞으로의 탬플릿 처리는현재경로의 templates라는 곳에서진행이 되게끔 추가를 해준다그리고 당연하게도현재 경로에 templates라는 폴더는 없기 때문에새로 생성을 해줘야 한다반드시 현재 경로에 폴더를 생성하고나서templates 밑에 vote 폴더를 하나 더 생성한다그리고 그 vote 폴더안에index.html이라는 파일을 만들어준다그럼 앞에 views에 랜더링 할때'vote/index.html'을 들어가면방금 만들었던 경로로 처리가 된다만들었다면 index.html로 들어간다그리고 위와 같이 HTML 문법을 추가를 한다;은 웹페이지 상단을 꾸며주고;영역은 웹 페이지의 뼈대를 만들어준다여기서 Template Tag라는 개념이 있는데{%%} 형태는 데이터를 제어하고{{}} 는 데이터를 사용하기 위함이 목적이다render를 통해 데이터셋이index.html로 넘어간건데{% if question_list %}는넘어간 데이터가 있다면 안에있는 문장이 동작이 되는것이다그리고 저번시간에 확인했던것처럼데이터셋을 반복문안에 넣으면question안에는 데이터셋의하나의 객체가 들어가게 된다{% for question in question_list %}즉 question에 .을 통해Question 설문조사 사이트 테이블에 있는데이터를 출력할 수 있다이렇게 서버를 실행하였을 때잘 나온다면 성공이다저기 나오는 질문들은태그로 감싸줬고href=를 통해 클릭을 하면해당 경로로 이동하게끔 구현을 했다/vote/pk 값을 넣어detail 페이지로 가게끔 구현을 했다다만 detail이라는 함수는 아직 없기 때문에views로 가서 기능을 추가해주자detail을 만들면서다른 기능들에 필요한 모듈들도 일단 추가를 해줬다detail을 보면get_object_or_404라는 함수를 사용했다조건에 맞는 데이터를 DB에서 조회 후 객체 형식으로 반환하며, 만약 존재하지 않을 경우 404 Eroor 코드를 반환한다.reder는 딕셔너리 형태로 데이터를 보내야 되기에딕셔너리 형태로 전달을 해줬다그리고 render는 vote/detail.html을 렌더링 해줬는데detail.html에 데이터가 넘어가고접근은 키값으로 접근하면데이터를 조회할 수 있다detail.html은 아직 구현을 하지 않았기에구현을 하러 가자detail.html을 추가한다음아래와 같이 코드를추가한다아까 render로 데이터를 전달해줬기 때문에{{ question.question_text }} 형태로키 값으로 설문조사 사이트 .을 찍어 데이터를 출력하는것이다get_object_or_404 함수 기능으로해당 질문에 답변 목록이 없다면404오류가 발생한다고 했는데 {% if error_msg %}와 {{ error_msg }}가오류가 발생시 오류 명칭을 띄워준다 form 태그는 어떠한 처리가 있을 때 사용하는 태그인데form태그 밑에는 {% csrf_token %}가 항상 있어야 한다이는 장고 보안설정으로 필수로 작성해줘야 하는데시서프 공격을 대비하는 작업이다, 정상적 루프가아닌 폼태그를 통한 무한 접근을 하는걸 방지하고자정상적으로 접근시에만 token을 주어 데이터를 처리하는것이다그리고 method=post"이렇게매서드는 post로 지정해줬는데데이터 전달이 필요할 때 꼭 넣어줘야한다사용자가 어떠한 목록을 선택하고투표하기를 누르면 해당 값이 넘어가야 되기 때문이다{% for choice in question.choice_set.all %} 이거는부모키로 접근을 하여 반복문을 돌린거다type=radio은 선택이 가능한 타입이고id=choice{{ forloop.counter }}"value={{ choice.id }}가 있는데id는 각 데이터를 설문조사 사이트 구분하기 위하여name는 넘어가는 데이터의 구분value는 선택된 값이 넘어갈 때 전달되는 데이터이다여기서 forloop.counter 란template 기능으로 반복분의 횟수를 출력해준다type=submit은 제출하는 형태로클릭을 하면 데이터가 넘어가게 해준다이렇게 화면이 나오면 성공이다3가지 질문 중 하나를 선택하고vote를 누르면action={% url 'vote:vote'question.id %}로 인해서동작이 되는데vote:vote는 vote앱의 vote라는 이름이라는 뜻이다vote에 urls.py에서 지정한앱이름과url의 name이라는 뜻이다그래서 name에 따라 해당경로가 동작이 되어사용자가 vote한값의 id/vote 형태로 url 요청이 나온다그렇다면 vote라는 함수가 없으니views.py로 만들러 가자detail 때처럼 get_object_or_404를 사용해 데이터를 가져왔다그리고 choice.id와 Question.id와 비교를 하는데외래키 주요키 관계이기 때문에 같을 수 밖에 없다pk=request.POST['choice'] 이거는form에서 post를 넘겨주면서 name=choice로 해줬기 때문에결론적으로는 사용자가 선택했는 답변이 저장이 된다그리고 try execpt를 통해서답변이 없는 경우 오류를 전달하면서다시 detail로 돌아가게끔 설문조사 사이트 하였다그리고 try문이 잘 동작되면else가 실행이 되게끔 하여vote에 1을 더하고 저장을 한 형태이다HttpResponseRedirect는최종적으로 vote 함수를 수행 후 응답처리를 result 함수로 넘겨주기 위함이 목적이다그리고 reverse 함수를 사용해새로운 views로 이동하게끔 했고결과를 볼 때 필요하여args=(question.id,)를 통해 데이터를 함께 넘겨줬다여기서 HttpResponseRedirect의 구조상반드시 여래개의 튜플로 넘어가야 하기에,를 붙이게 되었다이제 vote:result로 인해서views에 있는 result로 가지게된다그렇다면 result 함수를 새로 만들어야 한다이렇게 result.html로 데이터를 보내고우린 result.html을 만들면 된다생성이렇게 작성을 해주면 된다이도 마찬가지로 데이터가 넘어갔기에출력이 가능하다이렇게 증가가 되었다면 성공한거다그리고 Vote Again ?은 태그로 감싸클릭시 vote:detail로 가게끔 하여다시 투표를할 수 있게끔 만들었다이렇게 장고프레임워크를 통해서설문조사를 하는 홈페이지를 만들어 보았다다음에는 더 많은 기능을 활용해서로그인,로그아웃 기능과 함께게시판 기능을 만들어 보도록 설문조사 사이트 하자
댓글목록 0
댓글 포인트 안내