Django

Django를 이용한 설문조사 앱 만들기 part.3

치킨맛코드 2022. 1. 12. 17:38

지난 시간에 이어서 마저 앱을 만들어 보도록 하자.

먼저 하드코딩된 URL을 제거해 보도록 하자.

 

하드코딩이란 아래와 같이 주소를 하나하나 일일히 입력한 것을 의미한다.

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

url이 바뀌게 될 경우 하나하나 일일히 바꿔야 하기 때문에 결국은 노가다가 될 수 있다. 이것을 없에기 위해 url에 이름을 부여하고 표현하도록하자.

 

URL에 이름을 부여하는것은 이미 polls/urls.py에서 해두었다. 코드를 자세히 살펴보면 'dtail'이라는 name을 지정해 둔 것을 볼 수 있을 것이다.

path('<int:question_id>/', views.detail, name='detail'),

temlplates/polls/index.html의 내용을 다음과 같이 수정하도록 하자. url을 쓸건데 detail이라는 것을 쓸거고 이 안의 question이라는 변수를 쓰겠다. 라는 의미이다.

<li>
    <a href="{% url 'polls:detail' question.id %}">
        {{ question.question_text }}
    </a>
</li>

이제 url의 이름의 공간을 정해 보도록 하자. 엡의 이름이 polls이기에 polls/urls.py에 이름을 polls로 추가하도록 하자.

app_name = 'polls'

이제는 form을 사용해 보도록 하자. font-end에서 나타나는 사용자의 이벤트(CRUD를 포함한 수집가능한 데이터)를 back-end로 옮기는 작업이다. detail.html을 다음과 같이 수정하도록 하자. 간략한 클릭이벤트, 라디오박스 등을 추가하는 것이다.(html을 사용할 줄 알다면 이해하기 쉬울 것 이다.)

아래의 내용은 투표를 하게 된다면 관리자 페이지(admin)에 투표횟수가 올라가고 그것이 잘 저장되어라. 라는 의미를 가진 명령어이다.

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
<fieldset>
    <legend><h1>{{ question.question_text }}</h1></legend>
    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
        <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
    {% endfor %}
</fieldset>
<input type="submit" value="Vote">
</form>

점점 더 뭔가가 만들어지고 사용할 수 있는 상태로 바뀌고 있는것을 확인할 수 있다.

 

 

하지만 지금은 DB자체가 수정되는 내용이 전혀 없기 때문에 그것을 추가해야한다. 아래의 명령어를 polls/views.py에 추가하도록 하자.

from django.template import loader
from django.http import Http404
from django.shortcuts import render
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from .models import Choice, Question

def vote(request, question_id):
    # question에 대해서는 값 pk가 question_id에 해당하는 pk를 가져올것이다.
    question = get_object_or_404(Question, pk=question_id)
    #그 question안의 question.choice_set(외래키)를 줌으로서 pk가 request.POST['choice']인 것을 찾으라 라는 의미이다.
    #request.POST['choice']는 request에서 온것을 확인하면 된다.==>detail에 있는 choice라는 name값을 찾으면 된다.
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        #만약 에러가 발생할 경우 아래와 같은 error_mesaages를 출력한다.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
        #selected_choice.votes값을 1 추가하고 저장해라.
        #DB가 변횐되서 저장이 된다.
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

 

이제 실제로 적용이 잘 되는지 확인해보자. 일단 여기까지는 잘 되는것을 확인할 수 있다. 하지만 이 다음이 더더욱 중요하다.

http://127.0.0.1:8000/admin/ 으로 넘어가서 체크한 데이터가 잘 넘어왔는지 확인해보자. vote가 1 로 올라가 있는 것을 확인할 수 있다. 그러면 이제 성공이다.

 

 

짝짝짝 축하한다 이제 장고의 기본을 알게 되었고 사용할 수 있게 되었다!!

 

더욱 자세한 내용은 아래의 장고 공식 홈페이지를 참조하면 된다!

 

https://docs.djangoproject.com/ko/4.0/

 

Django 문서 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com