ぽらろいどの日記

新しい知見を得たり、得られた知見を記録したり共有したりする場を予定しています。

Djangoの流れ(MVTモデル)

この記事の内容

  • Djangoで、ビュー関数 / 汎用ビューを利用した場合にどういう流れで処理が進むかをおさらいする
  • そうすることで、各.pyのファイルで何をしているかを捉えられるようにする
    • urls.py / views.py / models.py / forms.py / templates

  • 細かい一覧表示・更新・削除などの流れ(HTML表記や関数の組み合わせ)は触れていません
  • 部分的な綴りの間違いなどがあるかもしれないので、ご了承ください

背景/現状

  • Djangoの学習を通じて、一覧表示、追加、削除、更新ができるものを作成した
  • しかし、なぜそれが実現できているのかをすぐに説明できない
  • 一度整理しておくことで、次に作成するときにスムーズに作れるようにしたい

Djangoの流れ

どのように整理するか

  • 実行結果を確認するときはURLを叩いて試すので、「URLが叩かれると何が起こるか?」というのを整理の起点とする
  • まず、ビュー関数を用いた場合の流れイメージを整理する
  • 次に、その流れのどこが容易になっているかについて、ModelFormと汎用ビューを確認する

URLが叩かれたら:ビュー関数

  1. まず、URLを探す:ルーティング(urls.py)
    • ブラウザから要求されたページを作るのはView
    • なので、URLに該当するViewにたどり着く必要がある
      • そのためにプロジェクトのurls.pyから、該当のpathを探す
      • pathを辿り終えたら、そこに紐づけられたViewの関数を実行する

  2. 実際に受け取ったリクエストを処理して、レスポンスを返す(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で、引数の値をキーにして情報を検索する
        1. で受け取った値から検索をかける
      • このオブジェクトをformに渡すと、フォームの中の初期値に設定できる(HTML内のフォームに、値をセットできる)
    • 受け取った値からModel.objects.filter()で、情報を検索する

    4. レスポンスを返す

    • 単なる文字列の場合、直接HttpResponseをreturnする
    • HTMLを組み合わせる場合、template > app名 > .htmlという形でファイルを格納し、render関数を用いる
      • templateとなるHTMLに、情報を付け足したい場合はcontextを第3引数に指定する
      • DBから読み取った情報を用いる場合は、model / formをcontextに格納する
      • ユーザーからの入力を受けたい場合は、formをcontextに格納する
    • 別ページにリダイレクトさせたい場合は、redirect関数を用いる

  3. ページを作成し(template)、レスポンスを返す
    • View関数で呼び出されたTemplateにcontextの内容を格納し、ブラウザに渡す
      • Template内では{{ model.name }}や{% url 'app:update' %}などが利用できる

URLが叩かれたら:モデルフォーム、汎用ビュー

  • モデルフォーム
    • フォームは独自に定義する場合、フォームフィールドクラスを指定したり、引数にwidgetで詳細を指定したりする必要がある
    • ModelFormを利用すると、Modelと利用するFieldを指定するだけでFormの作成を行うことが出来る
  • 汎用ビュー
    • 関数で作成する場合、上記2.の項目の組み合わせが非常に複雑で、作成が面倒である
    • 汎用ビューのクラスを用いれば、モデルを中心に、利用するフォームやテンプレートを指示するだけで、一覧表示・更新・削除などを適切に関数を組み合わせて実現してくれる