polls 결과page만들기

2021. 7. 26. 02:47python/Django

728x90

투표결과 만들기

-번외로 반복하면 무조건 할수있다
-get 방식 post 방식의차이 : get방식은 url이 보인다, 넘어가는 data가 다 보인다 post도 url이 보이긴 하나 넘어가는 data가 header에 포함되기 때문에 다 보이지 않음
-post방식은 form태그 있을때만 나머지는 get방식

-redirect(직접 돌아간다) :직접하지않고 program적으로 request만들어서 쏜다 ? 
즉 html을 만드는 대신 url을 만들어 client에게 결과를 전달하고 클라이언트는 이 url로 서버에 다시 접속

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

-detail html
detail html form에 정보를 다음 호출 해야되므로
form action="http://localhost:8000/polls/{{ question.id }}/vote"
라고 써도 상관없지만

*form action="{% url 'polls:vote' question.id%}"
-url(url py에 app_name : path에서 name=) , /id

-id를 주는 이유는 polls:vote에 id값이 비어있기 때문에
-url을 표현하는 방법이며 주로 이표현을 사용
-polls:vote는 url.py에 추가하고 호출하기땜에 위와같이 작성
-위 방식은 html방식이다 program적으로는 하단의 views py(else)참조



-url.py
path('<int:question_id>/vote/', views.vote, name='vote')추가
-현재 view가 없기 때문에 추가해야한다


-view.py
def vote(request, question_id):
    # 2가지 경우가 있어요! 하나는 정상적으로 항목을 선택해서 투표하는 경우
    # 또 하나는 어떠한 것도 선택하지 않은 상황에서 투표버튼을 클릭하는 경우
    question = get_object_or_404(Question, pk=question_id)
    try:
        choice = question.choice_set.get(pk=request.POST['myChoice'])
    except(KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'err_msg': '아무것도 선택하지 않았어요!'
        })

- choice = question.choice_set.get(pk=request.POST
! request안에는 form tag가 빨려들어온다
! pk인 get은 내가 원하는 것만 그 기준은post 방식 request값 안의 넘어오는 key값
! id가 아닌 key값을 가져와야한다 id는 html,css이용
! 위 값은 사용자가 선택했을때 (pk)

-except(KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'err_msg': '아무것도 선택하지 않았어요!'
        })
-예외처리 (에러)   choice가 없어 import해주어야한다
-아무것도 누르지 않으면 다시 화면을 돌아가야되기때문에 return
-context대신 dic 생성 { 기존 방식(html), 에러메세지(detal html에추가)}
{% if err_msg %}
<h6>{{ err_msg }}</h6>
{% endif %}


else:
   choice.votes += 1
   choice.save()
# 정상적인 상황이기때문에 해당 항목에 대한 투표수를 증가시켜요!
# 최종화면에 대한 request를 생성해서 보내요!
# 증가 시키고 저장을 안하면 db에 축적이 안되므로 save().한다





return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

 

-client 에게 다시 return 을 해야되기 때문에 작성해야한다
-redirect(상단참조)로 /polls/id/result를 만든다 (예를 위해 하는것)
-redirect 사용을 위해 화면상단에 from django.http import HttpResponseRedirect 입력
# 이 기능을 새로운 request를 이용해서 새로운 View함수를 이용해서 처리할꺼예요!

# url을 표현하기 위해서 직접 입력하는 방법이 있구요(쉬워요)
url을 namespace와 name으로 url conf에서 찾아오는 코드 방법은 다음과 같아요!
-url에서 역으로(reverse) 가져오다 그래러 상단의 
from django.urls import reverse입력 
-이 방식은 오타와 유지보수때문에 자주 사용
-url conf가 없기 때문에 당연히 만들어줘야 한다
path('<int:question_id>/results/', views.results, name='results')

-reverse('polls:results', args=(question.id,) 
는args의 값을 polls:result로 넘겨준다 / question.id값이 없기때문 
/튜플로 표현해줘야한다(인자가 하나밖에 없기때문에 ,를 찍어줘야한다)

 

 

 

 

-당연히 views도 만들어 줘야한다
def results(request, question_id):
    # 마지막 3번째 화면(투표결과화면)을 만들어서 리턴해요!
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {
        'question': question
    })




-result.html을 만든다
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ question.question_text }}</h1>

    <ul>
        {% for choice in question.choice_set.all %}
            <li>{{ choice.choice_text }} - {{ choice.votes }} 표</li>
        {% endfor %}
    </ul>

    <a href="{% url 'polls:index' %}">질문선택화면으로 돌아가기</a>
</body>
</html>

'python > Django' 카테고리의 다른 글

models.Model field의 종류  (0) 2021.07.27
data 삭제 후 만들기  (0) 2021.07.26
polls 선택 page만들기  (0) 2021.07.23
polls 질문page 만들기  (0) 2021.07.23
url cof , view  (0) 2021.07.22