Django 1.0 중국어 문서 ------- 4부 양식 작성 안내

6815 단어 htmlWebdjango
간단한 폼을 작성하다
 
저희는 투표 상세 정보("polls/detail.html")를 업데이트하고
요소를 추가합니다.
 
<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.choice_set.all %}
    <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>

 
간략한 개요 분석
 
  • 위의 템플릿은 모든 투표 옵션에 하나의 선택 단추를 보여 줍니다.라디오 버튼의 값은 각 옵션의 ID에 연결되며, 각 라디오 버튼의 이름은 "choice"입니다.이것은 하나를 선택한 후에 제출하면choice=3.
  • 우리는 폼의 action을/polls/{{{{{poll.id}/vote/로 설정하고method="post"를 설정합니다.method="post"(method="get"을 사용하지 않음)를 사용하는 것은 매우 중요합니다. 제출한 폼 데이터가 서버에서 수정되기 때문입니다.서버에서 수정된 폼을 만들 때마다method="post"를 사용합니다.이 건의는 Django에만 국한된 것이 아니다.이것은 아주 좋은 WEB 개발 습관이다.
  • forloop.counter 인덱스 표시for가 몇 번 순환
  •  
    현재 우리는 제출한 데이터를 처리하기 위해 보기를 만들었는데, 우리가 말한 URLconf를 기억한다
     
    (r'^(?P\d+)/vote/$', 'mysite.polls.views.vote'),
    우리는 mysite/polls/views에 있습니다.py:에서 vote() 함수를 만듭니다.
     
    from django.shortcuts import get_object_or_404, render_to_response
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    from mysite.polls.models import Choice, Poll
    # ...
    def vote(request, poll_id):
        p = get_object_or_404(Poll, pk=poll_id)
        try:
            selected_choice = p.choice_set.get(pk=request.POST['choice'])
        except (KeyError, Choice.DoesNotExist):
            # Redisplay the poll voting form.
            return render_to_response('polls/detail.html', {
                'poll': p,
                'error_message': "You didn't select a choice.",
            })
        else:
            selected_choice.votes += 1
            selected_choice.save()
            # Always return an HttpResponseRedirect after successfully dealing
            # with POST data. This prevents data from being posted twice if a
            # user hits the Back button.
            return HttpResponseRedirect(reverse('mysite.polls.views.results', args=(p.id,)))
    

     
     
  • request.POST는 데이터를 제출하는 사전(POST 방식)이다.여기,request.POST['choice']에서 선택한 옵션 ID, 문자 형식을 받았습니다.request.POST 값은 모두 문자입니다.Django도 request.GETGET 요청을 수락하는 파라미터를 제공하지만 저희가 실제적으로 사용하는 request.POST는 코드에서 데이터가 POST에 제출되도록 확보합니다.
  • request.POST ['choice'] 이렇게 쓰면 POST에choice 파라미터가 없으면 이상이 발생합니다.
  • 옵션을 추가하면 코드가 보통HttpResponseRedirect이 아닌 HttpResponse로 되돌아옵니다.HttpResponseRedirect에는 URL이 리디렉션됩니다.제출한 데이터를 성공적으로 처리한 후에 HttpResponseRedirect로 돌아가는 것도 좋은 WEB 개발 습관이다.
  • 우리는reverse() 함수를 HttpResponseRedirect구조기에 사용합니다.지정한 보기에 매개 변수를 전달합니다.

  • '/polls/3/results/'
     
    투표가 완료되면 결과 보기로 이동합니다.
     
    def results(request, poll_id):
        p = get_object_or_404(Poll, pk=poll_id)
        return render_to_response('polls/results.html', {'poll': p})
    

     
     
    result를 생성합니다.html 템플릿
     
    <h1>{{ poll.question }}</h1>
    
    <ul>
    {% for choice in poll.choice_set.all %}
        <li>{{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
    {% endfor %}
    </ul>
    

     
     
     
    일반 보기 사용: 더 적은 코드 쓰기
     
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('mysite.polls.views',
        (r'^$', 'index'),
        (r'^(?P<poll_id>\d+)/$', 'detail'),
        (r'^(?P<poll_id>\d+)/results/$', 'results'),
        (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
    )
    

     
     
    다음과 같이 고치다
    from django.conf.urls.defaults import *
    from mysite.polls.models import Poll
    
    info_dict = {
        'queryset': Poll.objects.all(),
    }
    
    urlpatterns = patterns('',
        (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
        (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
        url(r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html'), 'poll_results'),
        (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
    )
    

     
    우리는 두 개의 일반 보기를 사용했다: Objectlist() 및 objectdetail(). 두 개의 추상적인 보기는 각각 목록 대상과 상세한 내용 대상을 보여 줍니다.
     
  • 모든 일반 보기는 그 데이터를 표시해야 한다. 데이터는 사전을 통해 제공되고queryset은 데이터 목록에 대응한다
  • object_detail () 일반 보기는 URL에서 ID 값을 포획합니다. 이름은 "Object id"이기 때문에 pollid를 Object 로 변경id
  • poll_results(원문 참조)
  • 좋은 웹페이지 즐겨찾기