「Djangoパーフェクトマスター」投票アプリのビューを作る【Udemyで学習】

www.youtube.com

このレクチャーでは「投票アプリのビューを作る」を説明します。

ビューはWebアプリケーションの、特定の画面に対する前処理です。画面をどのように見せるかは、次のレクチャーで説明する、テンプレートが担当します。ビューは、テンプレートが動的に表示するデータを準備するプログラムであると言えます。

投票アプリでは、四つのビューを作成します。一つは、最新の質問をいくつか表示するための「質問インデックスページビュー」、二つ目は、特定の質問の質問テキストと、投票フォームを表示するための「質問詳細ページビュー」、三つ目は、特定の質問の結果を表示するための「質問結果ページビュー」、四つ目は、投票フォームから送信されるデータを処理する「投票ビュー」です。

四つのビューの説明の中に「特定の質問」という言葉を何回か、言いました。ビューは、特定の質問がどの質問であるかを、Questionモデルのidフィールドで受け取ります。Questionモデルの定義では、idというクラス変数を定義しなかったのですが、 Djangoのモデルでは、自動的にidというフィールドが準備され、レコードが作成される順番で連番が付与されます。ビューにはこのQuestionモデルのidを指示するというわけです。

では、どのようにQuestionモデルのidを指示するのでしょうか。その役目を担っているのが、URLパターンです。スライドでご覧いただいている表に、それぞれのビューに対応する「URLパターン」と「URLの例」を掲載しました。URLパターンとは、URLのパス名を「文字列と変数」で表現したものです。URLのパス名とは、http://ホスト名/の後ろのことです。例えば、質問結果ページビューでは、はじめにquestion_idの数字が来て、その後に/result/が来ます。URLパスの末尾がこのパターンの時、Djangoは、質問結果ページビューのビュー関数を呼び出し、その際にURLの一部から拾った、Questionモデルのidを特定の質問を判断するキー項目として、ビューに教えてあげるのです。このURLの一部から拾った変数は「キャプチャ変数」とも呼ばれます。

ご覧頂いてる表には、ビューに対応するテンプレートのファイル名を記載しました。テンプレートはこの後のレクチャーで作成します。

四つのビュー関数を作成する前に、プロジェクトのURLconfに、URLパターンとビュー関数の紐付けを追加します。スライドでurls.pyファイルをご覧いただいています。上から順に説明していきましょう。

まずはapp_name変数に、'polls'を設定しています。これは、名前空間の指定をしています。名前空間の設定は、この後説明するURLの逆引き機能を使用する際に、役立つ機能です。詳細は逆引きの説明の際に、併せて説明します。

それからurlpatternsリストに3行追加します。追加して4つの要素になりましたが、この4つの要素が、先ほど表で説明した「4つのURLパターンとビュー関数の紐付け」に対応します。pathメソッドの第一引数がURLパターン、第二引数がビュー関数、第三引数がname属性の指定となります。name属性は、URLの逆引きの際に指定する名前です。nameの説明を、追加した2行目のname=resultsで説明します。resultsという名前でURLの逆引きを行うと、「数字/results/」というURLを取得することができます。数字の部分は、逆引きの際に、パラメータでQuestionモデルのidを指定します。このURLconfは、プロジェクトのURLconfにincludeされることを、前のレクチャーで説明しました。resultsやdetailのような名前は、複数のプロジェクトのURLconfで、重なる可能性があります。そこでapp_nameで指定した名前空間の出番です。URLの逆引きの際に、名前の前に名前空間コロンを指定するのです。この例ではpolls:resultsという名前でURLの逆引きを行うことができます。ちょっと難しいかもしれませんね。URLの逆引きは、この後のテンプレート作成で使用します。使用例と一緒に考えると、理解できると思います。

それでは、いよいよビュー関数を作成します。最終的には4つのビュー関数を作成するのですが、このレクチャーではindexメソッドとdetailメソッドを作成します。resultsメソッドとvoteメソッドについては、後のレクチャー「フォームを作る」で追加します。

はじめは、indexメソッドです。ビュー関数の第一引数には、必ず、HTTPRequestオブジェクトが設定されます。この例では、HTTPRequestオブジェクトをrequest変数で受け取っています。ビュー関数、indexメソッドの1行目では、Questionモデルから最新5件のQuerySetを取得しています。最新5件は、pub_dateの降順にソートし上から5件取得すること実現しています。QuerySetとは、モデルの検索結果が格納される、インスタンスリストです。取得したQuerySetをlatest_question_list(レイテスト〜)変数に格納し、さらに2行目で、context変数に辞書形式でラップしています。3行目では、renderショートカット関数を利用して、HTMLを生成して、HTTPレスポンスに格納し、返却しています。HTMLはindex.htmlをテンプレートとしてレンダリングし生成しています。レンダリングのために、context変数を第三引数に設定して引き渡していることをご確認ください。

次は、detailメソッドです。メソッドの引数を確認すると、indexメソッドには無かったquestion_idが第二引数にあることがわかります。この第二引数には、このビュー関数がコールされるときに、URLパターンから取得したキャプチャ変数が入ります。1行目では、get_obejct_or_404ショートカット関数を利用して、Qustionモデルのインスタンスを所得しています。第一引数にはモデルのクラス名を、第二引数には検索する主キーを指定しています。2行目では、renderショートカット関数を利用して、HTMLを生成して、HTTPレスポンスに格納し返却しています。HTMLはdetail.htmlをテンプレートとしてレンダリングし、生成しています。レンダリングのために、第三引数に、辞書型のコンテキストを、直書きで設定して引き渡していることをご確認ください。

以上で「投票アプリのビューを作る」の説明を終わります。

★★★ 続きはUdemyで ★★★
https://www.udemy.com/course/django_master/?referralCode=3B5D0AF66B09A7B8DD25
★★★ コース内でお逢いできることを楽しみにしています。 ★★★