Korean translation of http://www.djangoproject.com/documentation/tutorial4
<-- |
[../Tutorial3] |
[../Tutorial1] |
--> |
당신의 첫번째 장고 프로그램 만들기, part 4
이 문서는 Django 0.9.1을 다룬다. 구버전 : 0.90 docs
By Adrian Holovaty <holovaty@gmail.com>, Translated by [parkpro77]
간단한 형태 작성하기
마지막 튜토리얼로부터 투표 세부 템플릿 (poll detail template)을 업데이트하고 나서, 템플릿에 HTML <form> 요소를 포함하자:
<h1>{{ poll.question }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <form action="/polls/{{ poll.id }}/vote/" method="post"> {% for choice in poll.get_choice_list %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br /> {% endfor %} <input type="submit" value="Vote" /> </form>
빠른 요약:
- 위의 주형은 각 투표 선택을 위한 라디오 버튼 (radio butten)을 보여준다. 각 라디오 버튼의 값은 투표 선택의 ID와 관련되어져 있다. 각 라디오 버튼의 이름은 "choice" 이다. 어떤 사람이 라디오 버튼 중 하나를 선택하고 그 형태를 전송할 때, 그것은 POST 데이타인 choice=3 을 보낼 것이다. 이것은 HTML Forms 101 이다.
우리는 /polls//vote/ 로 형태의 액션 (form's action)을 구성했고, method="post" 로 구성했다. (method="get" 과는 반대로서) method="post" 를 사용하는 것은 전송하는 행위가 서버 측의 데이타를 개조할 것이기 때문에 매우 중요하다. 서버 측의 데이타를 바꿔주는 형태를 만들때마다 method="post" 를 사용하라. 이 팁은 장고에게는 중요하지 않다; 그것은 단지 좋은 웹을 개발하는 행위일 뿐이다.
이제, 전송된 데이타를 처리하고, 어떤것을 하는 보기를 만들자. 튜토리얼3에서 이 라인이 포함되어진 URLconf를 만들었다는 것을 기억하라:
r'^polls/(?P<poll_id>\d+)/vote/$', 'myproject.polls.views.vote'),
그래서, myproject/polls/views.py 에서 vote() 기능을 만들자:
1 from django.core.extensions import get_object_or_404, render_to_response
2 from django.models.polls import choices, polls
3 from django.utils.httpwrappers import HttpResponseRedirect
4
5 def vote(request, poll_id):
6 p = get_object_or_404(polls, pk=poll_id)
7 try:
8 selected_choice = p.get_choice(pk=request.POST['choice'])
9 except (KeyError, choices.ChoiceDoesNotExist):
10 # Redisplay the poll voting form.
11 return render_to_response('polls/detail', {
12 'poll': p,
13 'error_message': "You didn't select a choice.",
14 })
15 else:
16 selected_choice.votes += 1
17 selected_choice.save()
18 # Always return an HttpResponseRedirect after successfully dealing
19 # with POST data. This prevents data from being posted twice if a
20 # user hits the Back button.
21 return HttpResponseRedirect('/polls/%s/results/' % p.id)
이 코드는 우리가 이 튜토리얼에서 아직 적용해보지 못했던 몇 가지를 포함한다:
- request.POST 는 키 이름에 의해 전송된 데이타가 접근하는 형식의 사전과 비슷한 객체이다. 이 경우에, request.POST['choice'] 는 문자로서 선택된 choice의 ID를 되돌린다. request.POST 값은 항상 문자열들이다. 같은 방법으로 GET 데이타에 접근하기 위해서 장고는 request.GET 을 제공한다 -- 그러나, 데이타가 오직 POST 호출을 경유해서 바뀐다는 것을 확실하게 하기 위해서 우리는 코드에서 명백하게 request.POST 를 사용하고 있다.
request.POST['choice'] 는 choice가 POST 데이타 안에 제공되어지지 않았다면, KetError를 일으킬 것이다. 위에 코드는 KeyError를 검사하고, 만약 choice가 주어지지 않았다면 에러 메세지와 함께 투표 형태 (poll form)를 다시 보여준다.
choice의 수가 증가한 후에, 표준 HttpResponse 보다는 HttpResponseRedirect를 되돌린다. HttpResponseRedirect는 하나의 인수를 얻는다: 사용자가 방향을 바꿀것 같은 URL. 할 수 있다면, http://와 도메인 이름은 쓰지 않아도 될 것이다. 그것은 도메인과 접촉되어 당신의 투표를 돕는다.
위에서 지적한 파이썬 주석에 따라, POST 데이타를 완전히 처리한 후에 항상 HttpResponseRedirect를 되돌린다. 이 팁은 장고에게는 특별하지 않다; 그것은 단지 좋은 웹을 개발하는
Use generic views: Less code is better