【無料】「Djangoのキホン」URLconf、ビュー、テンプレートの作成【Udemyで学習】

 

www.youtube.com

このレクチャーでは「URLconf、ビュー、テンプレートの作成」を説明します。

アプリケーションディレクトリであるnewsディレクトリ直下のurls.pyスクリプト、および、プロジェクトディレクトリであるmysiteディレクトリ直下のurls.pyスクリプトは、URLconfと呼ばれます。アプリケーションのurls.pyに定義されたurlpatternsリストは、URLパターンとビュー関数を紐付けます。URLconfは、URLとPythonブログラムを疎結合する役割を持っています。

newsアプリケーションのURLconfは、スライド上のようなプログラムになります。urlpatternsリストは、3行で記載された、3つの要素で構成され、すべてpathメソッドが記載されています。path()メソッドの第一引数には「URLパターン」を、第二引数には、viewモジュールのビュー関数を指定して、URLパターンとビュー関数を紐付けています。URLパターンの中の「int:変数名」は、任意の正の整数と合致することを意味しています。合致すると指定した変数に格納されます。ビュー関数は、この説明の後、作成します。

もう少し、詳細に説明しましょう。

一行目は、URLが「articles/正の整数/」の場合、viewsモジュールのyear_archiveメソッドがコールされることを意味しています。URLパターンの整数の部分は、西暦年で、ビュー関数にyear変数で引き継がれます。

二行目は、URLが「articles/正の整数/正の整数/」の場合、viewsモジュールのyear_monthメソッドがコールされることを意味しています。URLパターンの整数の部分は、西暦年と月で、ビュー関数に、year変数、month変数で引き継がれます。

三行目は、URLが「articles/正の整数/正の整数/正の整数」の場合、viewsモジュールのarticle_detailメソッドがコールされることを意味しています。URLの整数の部分は、西暦年と月とプライマリーキーで、ビュー関数に、year変数、month変数、pk変数で引き継がれます。

利用者がブラウザから、ページをリクエストすると、Djangoはurlpattersリストを上から順に検査し、要求されたURLに一致したURLパターンで停止し、紐付いたビュー関数をコールします。コールする際、URLパターンの可変部分は、メソッドの引数として引き継がれます。

次は、ビューを作ります。ビューは一般的に、データベースからデータを取得し、HTMLテンプレートをロードして、テンプレートの可変部分をデータベースの値などで埋め込んで、HTTPレスポンスを生成します。データベースを検索するためのキーは、URLconfから引き継いだ、URLの可変部分を使うことが多いと思い
ます。このレクチャーの場合では、西暦年や月などが相当します。

スライドの、ビューのスクリプトをご覧ください。このビューはnewsディレクトリ直下の、views.pyに記載されます。

このモジュールには、year_archiveメソッドだけが掲載されています。先ほど説明したURLconfのためには、3種類のビュー関数が必要ですが、ここでは1種類のみ説明します。

year_archiveメソッドは、引数として、request変数とyear変数を受け取っています。request変数はビュー関数が必ず受け取る、HTTPリクエストオブジェクトです。year変数はURLパターンから拾った西暦年です。メソッド内では、まず一行目で、Articleモデルを、pub_dateフィールドの年が、引数のyear変数と一致するという条件で検索し、インスタンスリストを取得しています。二行目では、辞書型のcontext変数に西暦年と、検索結果を入れ込んでいます。三行目では、renderメソッドを実行しreturnしています。renderメソッドは、第二引数で指定したHTMLテンプレートと、第三引数で指定したコンテキスト変数で、HTMLを生成します。生成したHTMLは、HTTPレスポンスに乗せて、ブラウザに送信されます。

次のスライドでは、テンプレートをご覧いただいています。

テンプレートの中で「{% %}」で囲まれた部分は、テンプレートタグと呼ばれる、特別な働きをするタグです。「{{ }}(二重の波括弧で囲まれた部分)」は、指定された変数の値に置き換わる部分で、テンプレート変数と呼ばれます。

スライド右側のHTMLテンプレートは、html要素の中に、head要素や、body要素が記載されたテンプレートです。上から四行目に「block title」タグと「endblock」タグがあります。また、下から三行目に、「block content」タグと「endblock」タグがあります。この部分は、左側のテンプレートの内容で置き換わる部分です。

もう少し説明します。左側のテンプレートの1行目に記載されたextendsは、テンプレートの継承機能を使うことを意味しています。この記載により、base.htmlというテンプレートをロードして、その中にある可変ブロックに、左側のテンプレートで生成したHTMLの断片を埋め込むことを意味しています。この継承機能によって、複数のテンプレートの重複記述を減らすことができます。

左側のテンプレートyear_archive.htmlには、二つのブロックが定義されています。一つは「block title」タグの行、二つ目は「block content」タグから始まるブロックです。いずれも、ブロック定義の終わりは「endblock」タグです。右側のテンプレートbase.htmlには、この二つのブロックを差し込む部分を定義しているというわけです。

もう一度、左のテンプレートをご覧ください。「for article in article_list」タグから「end for」タグは、コンテキスト変数で受け継いだ、Airtileモデルのインスタンスリスト数分、つまり検索で取得したレコード数分、繰り返される部分です。繰り返しの度、インスタンスはarticle変数に格納され、article変数のhead_lineフィールドの値を、p要素の値として出力しています。下から三行目「article.pub_date」の出力は、パイブ(縦棒)によりdateフィルタに送られています。dateフィルタは、引数の"F, j Y"の指定によって英語の月表示、日、4桁の西暦からなる文字列に整形され出力します。

以上で「URLconf、ビュー、テンプレートの作成」の説明を終わります。

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