Community

커뮤니티
게시판 상세보기
대기업도 사용하는 인터넷 설문조사 만들기 사이트 리스토베이로 시작!(218.49.13.82)
작성자 Stella 작성일 24-09-21 18:23 조회 17

저번시간에 설문조사 사이트 장고프레임워크로데이터를 다루는 방법을 알아보았다​오늘은 조금 더 많은 기능을 활용해설문조사 사이트를 만들어보자​앱 이름은 vote로 만들에정이다Vote에서 index.html로 들어온다면투표 가능한 리스트를 보여줄것이다그리고 투표 가능한 리스트 중 하나를 누르면투표 가능 목록이 보이게 되며투표를 할 수 있게 구현할것이다마지막으로 투표를 하고 나면결과 화면을 보여줄것이다​먼저 view와 Template의 경우서로에게 영향을 미치기 때문에데이터베이스인 모델작업 먼저하는 게 좋다​설문조사를 하는 앱이기 때문에각 데이터들은 NULL값이 없도록 설정하며질문을 저장하는 테이블과답변을 선택하고 답변 개수를 저장하는 테이블 두 개를 만들거다​django-admin startapp vote​vote앱을 생성 후앱을 등록하러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 makemigrations​python 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&quot이렇게매서드는 post로 지정해줬는데데이터 전달이 필요할 때 꼭 넣어줘야한다​사용자가 어떠한 목록을 선택하고투표하기를 누르면 해당 값이 넘어가야 되기 때문이다​{% for choice in question.choice_set.all %} 이거는부모키로 접근을 하여 반복문을 돌린거다​type=radio은 선택이 가능한 타입이고id=choice{{ forloop.counter }}&quotvalue={{ 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로 가게끔 하여다시 투표를할 수 있게끔 만들었다​이렇게 장고프레임워크를 통해서설문조사를 하는 홈페이지를 만들어 보았다​다음에는 더 많은 기능을 활용해서로그인,로그아웃 기능과 함께게시판 기능을 만들어 보도록 설문조사 사이트 하자

이전글 다음글
수정 삭제 목록 글쓰기