Language/Python

[Python] Django url/결과 저장/결과 보기

Dexter_- 2017. 8. 14. 18:10
728x90
반응형

 

 

링크 만들기

📌 herf 어트리뷰트로 link 주소를 설정한다. 지역구가 출력되는 곳에 링크를 추가 하려면 아래 코드를 참고 한다.

 

 

url 다루기

locallhost:8000/areas/미국/에 대한 url을 등록해주지 않았기 때문에 링크를 클릭하면 페이지를 찾을 수 없다는 창이 뜬다.(Page not found)

 

url을 등록하려면 urls.py와 view.py를 수정한다.

 

 

💡 url의 첫 번째 인자 - r'^areas/(?P<area>.+)/$'


Django에서 url의 첫 번째 인자는 보통 r'^.../...$' 과 같은 형태를 띄고 있다.
따옴표 안에 들어가는 내용은 정규표현식으로 나타낸다.

정규표현식의 내용을 간략히 보면
- ^ : 문자열의 시작을 알린다.
- areas : 문자 그대로 스트링 areas입니다.
- $ : 문자열의 끝을 알린다.
- (?<name>...) : symbolic 그룹 이름 name 으로 그룹과 매칭 되는 부분 문자열에 접근이 가능하다. (?P<area>.+)의 경우 group 이름은 area (부등호 <> 로 감싸진 부분)이며, 이를 통해 views.areas에 문자열을 전달한다.
.+는 개행 문자를 제외한 모든 문자를 의미한다.
정규표현식에 대한 더 자세한 내용은 다음을 참고한다.
- 정규표현식과 패턴을 배울 수 있는 사이트(한글) :정규표현식과 패턴들
- python 정규표현식에 대한 official documentation(영어) : python - re

url의 두 번째 인자 - views.areas

첫 번째 인자(정규표현식)와 매칭되는 주소를 요청받으면 views.areas 함수가 호출된다.

 

 

 

 

여론조사 화면 구현하기

elections 폴더에 area.html 파일 생성 후 코드입력

<!-- \mysite\templates\elections\area.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>지역구</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>지역구</h1>
<br>
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>이름</B></td>
            <td><B>소개</B></td>
            <td><B>기호</B></td>
            <td><B>지지하기</B></td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td> 후보1</td>
            <td> 후보소개 </td>
            <td> 기호1번 </td>
            <td>
                <form action = "#" method="post">
                    <button name="choice" value="#">선택</button>
                </form>
            </td>
        </tr>
        <tr>
            <td> 후보2</td>
            <td> 후보소개 </td>
            <td> 기호2번 </td>
            <td>
                <form action = "#" method="post">
                    <button name="choice" value="#">선택</button>
                </form>
            </td>
        </tr>       
        </tbody>
    </table>
</div>
</body>

 

views.py areas 함수 수정

 

새로고침 결과

 

  • area(지역구)에 따라서 필터 한 결과를 html 파일에 전달한다.

 

  • views.area로 부터 전달받은 context를 for문을 돌면서 출력한다.
<!-- C:\Code\mysite\templates\elections\area.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>{{area}}</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>{{area}}</h1>
<br>
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>이름</B></td>
            <td><B>소개</B></td>
            <td><B>기호</B></td>
            <td><B>지지하기</B></td>
        </tr>
        </thead>
        <tbody>
        {% for candidate in candidates %}
        <tr>
            <td> {{candidate.name}}</td>
            <td> {{candidate.introduction}}</td>
            <td> 기호{{candidate.party_number}}번 </td>
            <td>
                <form action = "#" method = "post">
                    <button name="choice" value="#">선택</button>
                </form>
            </td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
</body>

 

새로고침 결과

 

 

 

[선택하기] 버튼을 누르면 결과가 저장되게 만들기

  • area에 현재 진행 중인 poll이 있는지 확인하기

 

  • - lte : less than equal.
    • start_date__let = today : start_date <= today
  • gte : greater than equal.
    • end_date__gte = today : today <= end_date

 

  • 해당 poll을 이용해서 데이터들 저장
<!-- C:\Code\mysite\templates\elections\area.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>{{area}}</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>{{area}}</h1>
<br>
{% if poll %}
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>이름</B></td>
            <td><B>소개</B></td>
            <td><B>기호</B></td>
            <td><B>지지하기</B></td>
        </tr>
        </thead>
        <tbody>
        {% for candidate in candidates %}
        <tr>
            <td> {{candidate.name}}</td>
            <td> {{candidate.introduction}}</td>
            <td> 기호{{candidate.party_number}}번 </td>
            <td>
                <form action = "#" method = "post">
                    <button name="choice" value="#">선택</button>
                </form>
            </td>
        </tr>
        {% endfor %}
        <tbody>
    </table>
{% else %}
여론조사가 없습니다
{% endif %}
</div>
</body>

 

새로고침 결과

 

localhost:8000/admin 에서 poll 을 수정 후

 

예외처리가 잘 되지 않는 경우 다음을 추가한다.

# C:\Code\mysite\settings.py

# 기존 코드 유지
DATABASES = {
    #코드유지
}
DATABASE_OPTIONS = {'charset':'utf8'}    # 추가
TIME_ZONE ='Asia/Seoul'    # 추가
LANGUAGE_CODE = 'ko-kr'    #추가

# 기존 코드 유지

 

 

 

여론조사 결과 저장

  • 투표 결과를 DB에 저장
  • 웹사이트에서 결과를 전달
    • action : 선택 결과가 전달될 url을 지정한다.
    • value : 전달할 값을 지정한다.
<!-- C:\Code\mysite\templates\elections\area.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>{{area}}</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>지역구</h1>
<br>
{% if poll %}
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>이름</B></td>
            <td><B>소개</B></td>
            <td><B>기호</B></td>
            <td><B>지지하기</B></td>
        </tr>
        </thead>
        <tbody>
        {% for candidate in candidates %}
        <tr>
            <td> {{candidate.name}}</td>
            <td> {{candidate.introduction}}</td>
            <td> 기호{{candidate.party_number}}번 </td>
            <td>
                <form action = "/polls/{{poll.id}}/" method = "post">
                {% csrf_token %}
                    <button name="choice" value="{{candidate.id}}">선택</button>
                </form>
            </td>
        </tr>
        {% endfor %}
        <tbody>
    </table>
{% else %}
여론조사가 없습니다
{% endif %}
</div>
</body>

 

🎯 action 에서 지정한 url을 등록

 

🎯 view.polls 구현

 

localhost:8000 지지하기 항목의 선택 버튼을 클릭하면 아래와 같이 Choice object에 Votes 카운터가 증가된다.

 

 

 

여론조사 결과 보기1 - http redirect 하기

urls.py 에서 사용하는 정규표현식에 대한 강의 : 링크

templates < elections 에 아래와 같은 내용으로 result.html 파일을 생성 후 작성한다.

<!-- C:\Code\mysite\elections\templates\elections\result.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>지역구 여론조사 결과</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>지역구</h1>
<br>
<table class="table table-striped">
    <thead>
    <tr>
        <td><B>기간</B></td>
        <td><B>후보1</B></td>
        <td><B>후보2</B></td>        
    </tr>
    </thead>
    <tbody>
    <tr>
        <td> 기간1 </td>
        <td> 후보1 지지율</td>
        <td> 후보2 지지율</td>
    </tr>    
    <tbody>
</table>
</div>
</body>

 

아래와 같이 [가-힣]을 사용하면 한글 url 로 접속하도록 제한할 수 있다.

 

views.py 를 다음과 같이 수정한다.

 

선택 버튼을 누르면 다음과 같이 result.html 이 그려진다.

 

 

 

 

728x90
반응형