Django를 이용한 설문조사 앱 만들기 part.3
지난 시간에 이어서 마저 앱을 만들어 보도록 하자.
먼저 하드코딩된 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