【Django】はじめてのDjangoアプリ第9回

django

PythonのWEBフレームワークDjangoを利用したアプリケーションの公式テュートリアルに沿ったWEBアプリケーション作成のメモ第9回です。

Writing your first Django app, part 4 | Django documentation
The web framework for perfectionists with deadlines.

前回はフォームの設置をしました。

今回はフォームの続きを進めていきます。

汎用ビュー

(チュートリアル 3 の)detail() ビューと results() ビューは非常に短く、前述したように冗長です。投票のリストを表示する index() ビューも同様です。

これらのビューは、基本的な Web 開発の一般的なケースを表します。つまり、URL で渡されたパラメーターに従ってデータベースからデータを取得し、テンプレートをロードし、レンダリングされたテンプレートを返します。これはよくあることなので、Django では「汎用ビュー」システムと呼ばれるショートカットを提供しています。

ジェネリック ビューは、アプリを作成するために Python コードを記述する必要さえなくなるほど、一般的なパターンを抽象化します。たとえば、ListView および DetailView の汎用ビューは、それぞれ「オブジェクトのリストの表示」と「特定のタイプのオブジェクトの詳細ページの表示」の概念を抽象化します。

独自のコードを大量に削除できるように、汎用ビュー システムを使用するように投票アプリを変換しましょう。変換するにはいくつかの手順を踏む必要があります。これからやることは:

 1.URLconfを変換します。
 2.古い不要なビューの一部を削除します。
 3.Django の汎用ビューに基づいて新しいビューを導入します。

詳細については、以下をお読みください。

なぜコードシャッフルなのか?

一般に、Django アプリを作成するときは、汎用ビューが問題に適しているかどうかを評価し、コードを途中でリファクタリングするのではなく、最初から汎用ビューを使用します。ただし、このチュートリアルでは、核となる概念に焦点を当てるために、これまで「難しい方法で」ビューを記述することに意図的に焦点を当ててきました。

電卓を使い始める前に、基本的な数学を理解しておく必要があります。

URLconf を修正

まず、polls/urls.py URLconf を開き、次のように変更します。

from django.urls import path

from . import views

app_name = "polls"
urlpatterns = [
    path("", views.IndexView.as_view(), name="index"),
    path("<int:pk>/", views.DetailView.as_view(), name="detail"),
    path("<int:pk>/results/", views.ResultsView.as_view(), name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

2 番目と 3 番目のパターンのパス文字列で一致したパターンの名前が question_id から pk に変更されていることに注意してください。これが必要なのは、DetailView 汎用ビューを使用して、detail() ビューと results() ビューを置き換えることになり、URL からキャプチャされた主キー値が「pk」と呼ばれることを想定しているためです。

ビューの修正

次に、古いインデックス、詳細、結果ビューを削除し、代わりに Django の汎用ビューを使用します。これを行うには、polls/views.py ファイルを開いて次のように変更します。

※冒頭に追記

from django.views import generic

※「index()」「detail()」「results()」を置換

class IndexView(generic.ListView):
    template_name = "polls/index.html"
    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"

class ResultsView(generic.DetailView):
    model = Question
    template_name = "polls/results.html"

各汎用ビューは、どのモデルに基づいて動作するかを認識する必要があります。これは、model 属性 (この例では、DetailView および ResultsViewmodel = Question) を使用するか、(IndexView に示すように) get_queryset() メソッドを定義することによって提供されます。

デフォルトでは、DetailView 汎用ビューは <app_name>/<model_name>_detail.html というテンプレートを使用します。この例では、テンプレート「polls/question_detail.html」を使用します。 template_name 属性は、自動生成されたデフォルトのテンプレート名の代わりに特定のテンプレート名を使用するように Django に指示するために使用されます。また、resultリスト ビューの template_name も指定します。これにより、結果ビューと詳細ビューは、両方ともバックグラウンドで DetailView であっても、レンダリング時に異なる外観を持つことが保証されます。

同様に、ListView の汎用ビューは、<app_name>/<model_name>_list.html というデフォルトのテンプレートを使用します。 template_name を使用して、ListView に既存の「polls/index.html」テンプレートを使用するように指示します。

チュートリアルの前の部分では、テンプレートには、questionおよびlatest_question_list コンテキスト変数を含むコンテキストが提供されています。 DetailView の場合、question変数は自動的に提供されます。Django モデル (Question) を使用しているため、Django はコンテキスト変数の適切な名前を決定できます。ただし、ListView の場合、自動的に生成されるコンテキスト変数は question_list です。これをオーバーライドするには、context_object_name 属性を提供し、代わりにlatest_question_listを使用することを指定します。別のアプローチとして、新しいデフォルトのコンテキスト変数に一致するようにテンプレートを変更することもできますが、必要な変数を使用するように Django に指示する方がはるかに簡単です。

サーバーを実行し、汎用ビューに基づいて新しい投票アプリを使用します。

汎用ビューの詳細については、汎用ビューのドキュメントを参照してください。

フォームと一般的なビューに慣れたら、このチュートリアルのパート 5 を読んで、投票アプリのテストについて学習してください。

※ビューの見た目は変わらないので、画面キャプチャは割愛します。

今回は以上です。次回は自動テストを予定しています。

  • 0
  • 0
  • 0
  • 0

コメント

タイトルとURLをコピーしました