관리 메뉴

Storage Gonie

31. (app2) POST 처리 (투표결과 DB반영하기) 본문

웹개발/Django 웹서비스 개발(인프런)

31. (app2) POST 처리 (투표결과 DB반영하기)

Storage Gonie 2019. 2. 19. 21:30
반응형

1. views.py의 vote함수 수정하기

- 투표 화면에서 투표 버튼을 누르면 urls의 vote관련 url로 연결되고 vote함수가 호출된다.

- 이때 question_id가 파라미터로 전달되며 vote함수에서는 urls로 부터 전달받은 question_id로 특정 Question을 얻을 수 있게 된다.

- 그리고 request파라미터로 부터 from에서 선택했던 내용을 id를 통해 얻을 수 있으며 거기서 얻은 값으로 특정 choice 객체를 얻을 수 있다.

- 그러면 그 얻은 객체에 대해 연산을 수행해 주면 된다.

- 맨 마지막 줄 에 question_id = question_id를 해주는 이유는 polls:results에서 question_id 파라미터를 받고있기 때문이다.

- 두 모듈을 추가한다.

from django.shortcuts import get_object_or_404, redirect

def vote(request, question_id):
question = get_object_or_404(Question, pk = question_id)

try:
selected_choice = question.choice_set.get(pk = request.POST['choice']) # id가 choice인 것의 vlaue 값을 읽어옴
except:
return render(request, 'polls/detail.html', {
'question' : question,
'error_message' : "You didn't select a choice"
})
else: #예외가 발생하지 않은경우
selected_choice.votes += 1 # 모델 객체의 값 변경
selected_choice.save() # DB에 반영
return redirect('polls:results', question_id = question_id)

위 코드를 이해하기 쉽도록 <detail..html>을 첨부하였음.

<h2>{{ question.question_text }}</h2>

{% if error_message %}
<p><strong>{{ error_message }}</strong></p>
{% endif %}

<form action="{% url 'polls:vote' question.id%}" method="POST">
{% csrf_token %}

{% 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 %}
<input type="submit" value="투표"/>
</form>

<아무것도 선택하지 않고 투표를 누른경우>

<짬뽕을 누르고 투표를 누른경우>


반응형
Comments