[Django]学習長期公式チュートリアル-part 3&Part 4


Part 3
1.Viewを現実にする

  • HttpResponse-オブジェクトを返す
    #polls.views.py
    from django.http import HttpResponse
    ...
      return HttpResponse(output)

  • render()-HttpResponseオブジェクトの構文を返すショートカットを簡略化
    #polls.views.py
    from django.shortcuts import render
    ...
    return render(request, 'polls/index.html', context)

  • 励起Http 404-404
    from django.http import Http404
    from django.shortcuts import render
    
    from .models import Question
    ...
      def detail(request, question_id):
          try:
              question = Question.objects.get(pk=question_id)
          except Question.DoesNotExist:
              raise Http404("Question does not exist")
          return render(request, 'polls/detail.html', {'question': question})

  • get objector 404()-Http 404の異常を引き起こすショートカット
    from django.shortcuts import get_object_or_404, render
    
    from .models import Question
    ...
    def detail(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, 'polls/detail.html', {'question': question})
  • 2.テンプレートからハードコーディングのURLを削除する
  • テンプレートにリンクを書き込むと、そのリンクは部分的にハードコーディングされる
    #polls/index.html 
    <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
  • polls.urlsモジュールのpath()関数にパラメータの名前が定義されているため、{%url%}テンプレートタグを使用してurl設定で定義された特定のURLパスの依存性を解消できます.
    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
  • Part 4
    1.form要素の使用
    <form action="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
        <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
    {% endfor %}
    <input type="submit" value="Vote">
    </form>
  • 提出したデータをフォーム処理し、投票()関数を用いて情報を格納する.
    def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice']) # 선택된 설문의 ID를 문자열로 반환
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
  • 2.General Viewの使用
  • Generic Viewは一般モードを抽象化しており、アプリケーションを記述するためにPythonコードを記述する必要はない.
  • ListView-オブジェクトリスト表示抽象化
      ```
      class IndexView(generic.ListView):
      template_name = 'polls/index.html' # "polls/index.html" 템플릿을 사용하기 위해 ListView 에 template_name 를 전달
      context_object_name = 'latest_question_list'
    
      def get_queryset(self):
          """Return the last five published questions."""
          return Question.objects.order_by('-pub_date')[:5]
     ```
  • 詳細表示-特定オブジェクトタイプの詳細ページを表示する
    class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html' #  <app name>/<model name>_detail.html 템플릿을 사용