django 1.8 공식 문서 번역: 1-2-4 당신의 첫 번째 Django 응용 프로그램 작성, 4부분

8356 단어 django
너의 첫 번째 Django 프로그램의 네 번째 부분을 작성해라
본 강좌는 강좌의 세 번째 부분을 이어받는다.우리는 계속해서 Web-poll 응용 프로그램을 개발하고 간단한 창을 처리하고 우리의 코드를 최적화하는 데 관심을 기울일 것이다.
간단한 창을 작성하다
이전 자습서에서 작성한 poll의detail 템플릿을 업데이트하여 템플릿에 HTML을 포함하는 구성 요소를 만들겠습니다.

{{ poll.question }}

{% if error_message %}

{{ error_message }}

{% endif %} {% csrf_token %} {% for choice in poll.choice_set.all %}
{% endfor %}

간단하게 요약하면 다음과 같습니다.
  • 위의 템플릿에는 각 투표 옵션에 대한 라디오 버튼이 설정되어 있습니다.각 라디오 버튼의value는 투표 옵션에 해당하는 ID입니다.각 라디오 버튼의 name은 “choice”입니다.이것은 누군가가 선택 단추를 선택하고 폼을 제출하면 보내는 POST 데이터가choice=3라는 것을 의미한다.이것은 HTML 양식의 기본 개념입니다.
  • form의 action을 {% url'polls:vote'poll.id%}method='post'로 설정합니다.method="post"(method="get"이 아닌)를 사용하는 것은 서버 측의 데이터를 제출하는 방식이 바뀌기 때문에 매우 중요하다.서버 측의 데이터를 수정하기 위해 폼을 만들 때method="post"를 사용하십시오.이것은 Django의 특정한 기교가 아니다.이것은 우수한 웹 개발 실천이다.
  • forloop.counter는 for 탭이 순환 중 순환한 횟수를 표시합니다
  • POST form(데이터를 수정하는 기능이 있음)을 만들려면 사이트 간 위조 요청(Cross Site Request Forgeries)을 걱정해야 합니다.다행히도, 너는 이 점을 너무 걱정할 필요가 없다. 왜냐하면, Django는 스스로 매우 쉽게 사용할 수 있는 시스템을 가지고 있기 때문이다.한 마디로 하면, 모든 POST form은 내부의 URLs에 대해 {% csrf token%} 템플릿 탭을 사용해야 합니다.

  • 이제 제출한 데이터를 처리하기 위해 Django 보기를 만듭니다.기억나세요?자습서 3부에서는 polls 응용 프로그램을 위한 URLconf 구성에 다음 행 코드가 포함되어 있습니다.
    url(r'^(?P\d+)/vote/$', views.vote, name='vote'),

    가상 구현된vote () 함수도 만들었습니다.우리 실제 버전을 하나 만들자.polls/views에서.py에 다음 코드가 추가됩니다.
    from django.shortcuts import get_object_or_404, render
    from django.http import HttpResponseRedirect, HttpResponse
    from django.core.urlresolvers import reverse
    from 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(request, '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('polls:results', args=(p.id,)))

    이 코드의 일부 내용은 이 강좌에서 언급하지 않았다.
    request.POST는 키워드 이름을 통해 제출한 데이터를 얻을 수 있는 사전과 유사한 대상입니다.이 예에서, Request.POST['choice']는 선택한 투표 항목의 ID를 문자열로 반환합니다.request.POST 값은 항상 문자열로 표시됩니다.
    Django도 Request를 통해 같은 기능을 제공합니다.GET가 GET 데이터를 가져오는 방법 - 코드에서 리퀘스트를 명확하게 사용했습니다.POST 메서드는 POST 메서드를 통해 데이터가 수정되었는지 확인합니다.
    만약 초이스가 POST 데이터에 Request를 제공하지 않는다면.POST['choice']는 KeyError를 던집니다.choice 대상이 지정되지 않았을 때 위의 코드가 던진 것이 KeyError 이상이면 poll에 오류 메시지를 표시합니다.
    투표 옵션의 통계 수를 늘린 후 코드는 일반적인 Http Response Redirect 대상이 아닌 Http Response 대상을 되돌려줍니다.Http ResponseRedirect 객체에는 사용자가 리디렉션되는 URL이 필요합니다. 이 경우 URL을 구성하는 방법을 계속 보십시오.
    위에서 Python으로 작성한 주석처럼 POST 데이터를 성공적으로 처리한 후에 Http Response Redirect 대상을 항상 되돌려야 합니다.이 기교는 Django에게 특정된 것이 아니다.그것은 우수한 웹 개발 실천이다.
    이 예에서는 Http ResponseRedirect의 구성 방법에서 reverse() 함수를 사용했습니다.이 함수는 뷰에서 URL을 하드코딩하지 않도록 하는 데 도움이 됩니다.이것은 우리가 원하는 점프 보기 함수 이름과 보기 함수의 URL 모드에 해당하는 가변 인자를 지정합니다.이 예에서, 우리는 강좌 3부분의 URLconf 설정을 사용했고,reverse () 는 다음과 같은 문자열을 되돌려줍니다
    '/polls/3/results/'

    ... 이 3은 p.id의 값입니다.URL을 리디렉션하면'results'뷰가 호출되고 최종 페이지가 표시됩니다.
    강좌 3부분에서 언급한 바와 같이 request는 HttpRequest 대상이다.Http Request 객체에 대한 자세한 내용은 Request 및 response 문서를 참조하십시오.
    누군가가 투표를 한 후 vote() 보기는 투표 결과 페이지로 바뀐다.이 보기를 작성해 보도록 하겠습니다.
    def results(request, poll_id):
        poll = get_object_or_404(Poll, pk=poll_id)
        return render(request, 'polls/results.html', {'poll': poll})

    이것은 거의 교과서 3부분의detail () 보기와 완전히 같다.유일한 차이점은 템플릿 이름입니다.잠시 후에 우리는 이 불필요한 문제를 해결할 것이다.
    polls/results를 만듭니다.html 템플릿:

    {{ poll.question }}

      {% for choice in poll.choice_set.all %}
    • {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
    • {% endfor %}
    Vote again?

    현재 브라우저에서/polls/1/을 방문하여 투표를 완료합니다.매번 투표를 한 후에 결과 페이지의 데이터가 업데이트되는 것을 볼 수 있을 것이다.투표 옵션을 선택하지 않고 제출하면 잘못된 정보를 볼 수 있습니다.
    공통 뷰 사용:코드 최적화
    detail () (교과서 3부분에서) 와results () 보기는 모두 간단합니다. 그리고 위에서 언급한 불필요한 문제도 있습니다.index()polls 목록을 표시하는 index () 보기 (교과서 3부분에서도) 에도 비슷한 문제가 있습니다.
    이러한 뷰는 URL의 매개 변수에 따라 데이터베이스에서 데이터를 가져오고 템플릿을 로드하고 렌더링된 컨텐트를 반환하는 기본 웹 개발의 일반적인 문제를 나타냅니다.이러한 현상이 매우 흔하기 때문에 Django는 일종의 단축 방식을 제공하여'통용 보기'시스템이라고 부른다.
    일반적인 보기는 일반적인 패턴을 추상적으로 보여서, 응용 프로그램을 작성하기 위해 파이톤 코드를 작성할 필요가 없다.
    폴 앱을 유니버설 뷰 시스템을 사용하는 앱으로 수정하면 저희 코드를 삭제할 수 있습니다.수정 절차는 다음과 같습니다.
  • URLconf를 수정합니다.
  • 낡고 불필요한 보기를 삭제합니다.
  • URL을 수정하여 새 뷰로 처리합니다.

  • 자세한 내용은 계속 참조하십시오.
    코드를 왜 재구성해야 합니까?
    통상적으로, Django 응용 프로그램을 작성할 때, 일반적인 보기가 당신의 문제를 해결하는 데 적합한지 평가할 것이다. 만약 당신에게 적합하다면 처음부터 그것을 사용해야 한다. 절반이 되어서야 코드를 재구성하는 것이 아니라.그러나 본 강좌는 지금까지 일부러'하드코딩'보기를 집중적으로 소개한 것은 핵심 개념에 집중하기 위한 것이다.
    계산기를 사용하기 전에 기본적인 수학 지식을 알아야 하는 것처럼.
    URLconf 수정
    우선polls/urls를 엽니다.py의 URLconf 프로필을 다음과 같이 수정합니다
    from django.conf.urls import patterns, url
    from django.views.generic import DetailView, ListView
    from polls.models import Poll
    
    urlpatterns = patterns('',
        url(r'^$',
            ListView.as_view(
                queryset=Poll.objects.order_by('-pub_date')[:5],
                context_object_name='latest_poll_list',
                template_name='polls/index.html'),
            name='index'),
        url(r'^(?P\d+)/$',
            DetailView.as_view(
                model=Poll,
                template_name='polls/detail.html'),
            name='detail'),
        url(r'^(?P\d+)/results/$',
            DetailView.as_view(
                model=Poll,
                template_name='polls/results.html'),
            name='results'),
        url(r'^(?P\d+)/vote/$', 'polls.views.vote', name='vote'),
    )

    views 수정
    여기서는 ListView와 DetailView 두 개의 공통 뷰를 사용합니다.이 두 보기는 각각 두 가지 추상적인 개념인 '일련의 대상의 목록 보이기' 와 '특정한 유형의 대상의 상세한 정보 페이지 보이기' 를 표시하는 데 사용된다.
  • 모든 보기는 어떤 모델 데이터를 사용하는지 알아야 한다.따라서 사용할 모델 매개 변수를 제공해야 합니다.
  • DetailView 일반 보기는 URL에서'pk'라는 키 값을 포획하기를 원하기 때문에 pollid가 pk로 변경되었습니다.

  • 기본적으로 DetailView 일반 뷰는/detail 이라는 이름을 사용합니다.html의 템플릿.우리의 예에서'polls/polldetail.html'이라는 템플릿을 사용할 것입니다.templatename 매개 변수는 자동으로 생성된 기본 템플릿 이름 대신 지정된 템플릿 이름을 사용하도록 Django에게 알려줍니다.우리도results 목록 보기의templatename을 지정했습니다. 이것은results 보기와detail 보기를 렌더링할 때 서로 다른 외관을 확보합니다. 비록detail 보기가 막후에 숨겨져 있지만.
    똑같아요~django.views.generic.list.ListView 일반 보기에 사용되는 기본 템플릿 이름은/list입니다.html ;우리는templatename 매개 변수를 지정해서ListView가 이미 존재하는'polls/index.html'템플릿을 사용하도록 알려 줍니다.
    이전 강좌에서 템플릿이 제공한 상하문에는poll과latestpollist 상하문 변수가 포함되어 있습니다.DetailView에서 poll 변수는 자동으로 제공됩니다. Django 모델(Poll)을 사용했기 때문에 Django는 상하문 변수에 적합한 이름을 정할 수 있습니다.또한 ListView에서 자동으로 생성되는 컨텍스트 변수 이름은 pollist입니다.이 변수를 덮어쓰려면 contextobjectname 옵션을 제공해야 합니다.latestpolllist로 대체합니다.대체 방법으로, 기본 상하문 변수와 일치하는 템플릿을 바꿀 수 있지만, 이것은 Django에게 원하는 변수를 사용하라고 쉽게 알려주는 방식입니다.
    지금 당신은 폴스/views에서py에서 index (),detail (),results () 보기가 삭제되었습니다.우리는 그것들을 필요로 하지 않는다. 그것들은 이미 일반적인 보기로 바뀌었다.더 이상 필요하지 않은 Http Response 가져오기 패키지를 삭제할 수도 있습니다.
    서버를 실행하고 일반 보기 기반의 새로운 투표 응용 프로그램을 사용합니다.
    일반 보기에 대한 자세한 정보는 일반 보기 문서를 참조하십시오.
    창과 일반적인 보기에 익숙해지면 교과서 5부분을 읽어서 투표 응용을 시험해 보세요.
    번역자: Django 문서 공동 번역 팀, 원문: Part 4: Forms and generic views.
    본고는 CC BY-NC-SA 3.0 프로토콜로 발표되었으며 전재는 작가의 서명과 글의 출처를 보존해 주십시오.
    Django 문서 협동 번역팀은 일손이 부족해서 관심 있는 친구가 우리에 가입할 수 있습니다. 완전 공익적입니다.교류군: 467338606.

    좋은 웹페이지 즐겨찾기