この記事の内容
- Djangoで、ビュー関数 / 汎用ビューを利用した場合にどういう流れで処理が進むかをおさらいする
- そうすることで、各.pyのファイルで何をしているかを捉えられるようにする
- urls.py / views.py / models.py / forms.py / templates
- 細かい一覧表示・更新・削除などの流れ(HTML表記や関数の組み合わせ)は触れていません
- 部分的な綴りの間違いなどがあるかもしれないので、ご了承ください
背景/現状
- Djangoの学習を通じて、一覧表示、追加、削除、更新ができるものを作成した
- しかし、なぜそれが実現できているのかをすぐに説明できない
- 一度整理しておくことで、次に作成するときにスムーズに作れるようにしたい
Djangoの流れ
どのように整理するか
- 実行結果を確認するときはURLを叩いて試すので、「URLが叩かれると何が起こるか?」というのを整理の起点とする
- まず、ビュー関数を用いた場合の流れイメージを整理する
- 次に、その流れのどこが容易になっているかについて、ModelFormと汎用ビューを確認する
URLが叩かれたら:ビュー関数
- まず、URLを探す:ルーティング(urls.py)
- ブラウザから要求されたページを作るのはView
- なので、URLに該当するViewにたどり着く必要がある
- そのためにプロジェクトのurls.pyから、該当のpathを探す
- pathを辿り終えたら、そこに紐づけられたViewの関数を実行する
- 実際に受け取ったリクエストを処理して、レスポンスを返す(views.py)
- Viewで、実際に要求されたページを作成する
- ページに必要な情報を取得するのはModel
- ページに必要なフォームを作成するのはForm
- なので、必要に応じてModelやFormを利用する必要がある
どのような処理が行われる?
1. 入力情報を取り出す
- パスコンバータ
- urls.pyのタイミングでパスコンバータを利用し、内容を取り出しておく
- GET
- GETかどうかを判断する(必要に応じて)
- request.GET['---'] / request.GET.get('---')で内容を取り出す
- POST
- POSTかどうかを判断する
- そのまま取り出す
- request.POST['---'] / request.POST.get('---')で内容を取り出せる
- バリデーションチェックをしてから取り出す(forms.py)
- バリデーションチェックができる(is_valid())
- データを適切な型に収めた形で取り出せる(form.cleaned_data['---'])
2. DBに情報を追加・更新・削除する
- 取り出した値を、適切なModelに格納する(models.py)
- Modelのsaveメソッドを利用する
- Modelのdeleteメソッドを利用する
3. 必要な情報をDBから取得する
- get_object_or_404やget_list_or_404で、引数の値をキーにして情報を検索する
- で受け取った値から検索をかける
- このオブジェクトをformに渡すと、フォームの中の初期値に設定できる(HTML内のフォームに、値をセットできる)
- 受け取った値からModel.objects.filter()で、情報を検索する
- 検索結果が入ったQuerySetから情報を取り出す場合は、以下を参照する
- Djangoのクエリセットから値を取得する方法 - 知的好奇心
4. レスポンスを返す
- 単なる文字列の場合、直接HttpResponseをreturnする
- HTMLを組み合わせる場合、template > app名 > .htmlという形でファイルを格納し、render関数を用いる
- templateとなるHTMLに、情報を付け足したい場合はcontextを第3引数に指定する
- DBから読み取った情報を用いる場合は、model / formをcontextに格納する
- ユーザーからの入力を受けたい場合は、formをcontextに格納する
- 別ページにリダイレクトさせたい場合は、redirect関数を用いる
- Viewで、実際に要求されたページを作成する
- ページを作成し(template)、レスポンスを返す
- View関数で呼び出されたTemplateにcontextの内容を格納し、ブラウザに渡す
- Template内では{{ model.name }}や{% url 'app:update' %}などが利用できる
- View関数で呼び出されたTemplateにcontextの内容を格納し、ブラウザに渡す
URLが叩かれたら:モデルフォーム、汎用ビュー
- モデルフォーム
- フォームは独自に定義する場合、フォームフィールドクラスを指定したり、引数にwidgetで詳細を指定したりする必要がある
- ModelFormを利用すると、Modelと利用するFieldを指定するだけでFormの作成を行うことが出来る
- 汎用ビュー
- 関数で作成する場合、上記2.の項目の組み合わせが非常に複雑で、作成が面倒である
- 汎用ビューのクラスを用いれば、モデルを中心に、利用するフォームやテンプレートを指示するだけで、一覧表示・更新・削除などを適切に関数を組み合わせて実現してくれる