Adminの続きです。汎用クラスベースビュー(※1)を使ってCRUDを実装していきます。標準搭載機能をフル活用し、ブログ・アプリを効率的に実装していきましょう。※1「汎用クラスベースビュー」を「クラスベース汎用ビュー」と呼ぶこともありますが、このコラムではDjango2.0の公式ドキュメントに準じて「汎用クラスベースビュー」で統一します。files)静的ファイルの設定スタイルシートの追加ここまでの振り返り状況整理のため第1回から第3回までを簡単に振り返ってみましょう。サンプル記事投稿これらを実施してきた結果、ディテクトリ・ファイル構造は下記の状態になっているかと思います。views.py12345678910111213141516myblog/manage.pymyblog/__init__.pysettings.pyurls.pywsgi.pyblogs/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.pyソースコードとデモサイト下記よりこのチュートリアルの最終ソースコードとデモサイトをチェックできます。デモサイトを先にチェックすると、記事内容がわかりやすいかと思います。作成するブログ・アプリの要件を確認しましょう。下記の5機能(5画面)です。記事の削除このチュートリアルの目的はDjango2によるCRUDの学習のためログイン機能(認証)については省略しています。Djangoの認証機能については別の機会で紹介できればと思います。files)の順で進めるとスムーズです。このチュートリアルでもこのワークフローに沿って進めていきます。実際の実装は1機能・画面ずつ試行錯誤しながら行いましたが、工程を行ったり来たりしながら説明すると、はじめての方の混乱を招いてしまいます。そのため以下では複数の機能・画面をまとめる形で簡潔に説明しています。モデルの作成とマイグレーションこちらは第2回で実装済みのため、この記事では省略します。モデルとマイグレーションを参照ください。モデルに1点だけ修正を加えます。URL設定・ルーティング(URLConf)Djangoのルーティングは「アプリレベルのURL設定」と「プロジェクトレベルのURL設定」の2つを行う必要があります。ルーティングは少し煩雑ですが、どのFWも一長一短があるものです。自動生成しないので、新規作成する必要があります。ビューの作成(views.py)」で定義するビュークラスのメソッドです。プロジェクトレベルのURL設定アプリレベルのURL設定をプロジェクトレベルのURL設定に追加しましょう。下記のように変更すれば追加完了です。ビューの作成(views.py)続いてアプリレベルのURL設定に対応するビューを作成しましょう。いった他言語の人気MVCフレームワークでいう「コントローラ」に(おおよそ)相当します。「テンプレート」は他MVCフレームワークの「ビュー」に相当します。用語の違いに注意しましょう。典型的なCRUD処理は、汎用クラスベースビュー・クラスを継承することで、驚くほど少ないコードで実装できてしまいます。ページネーション(IndexView)まで対応しています。GETやPOSTされるリクエストデータとPostモデルを使って事細かに処理することもできますが、汎用クラスベースビューをうまく利用すれば、開発効率を飛躍的に高めることができます。よりテンプレートファイルを明示的に指定しましたが、自動捜査されるテンプレートファイル(アプリ名/モデル名_list.htmlなど)に合わせこめば省略することも可能です。ガチガチの規約はなく、比較的自由に配置できてしまいます。いった雛形生成コマンドを実行しても、テンプレートに関するディレクトリやファイルは自動生成されません。いうディレクトリをプロジェクト・ルート直下に作成するも良し、各アプリケーション直下に作成するも良しです。自由度が高いといえば聞こえは良いですが、プロジェクトで方針を定めないとカオスになるので注意しましょう。ここではDjango公式チュートリアルと同様ように、すべてのテンプレートファイルをアプリケーション直下に設置することにします。いうディレクトリを作成して、ビューに対応する形でファイルを作成します。blogsディレクトリが不要に思うかもしれませんが、ミスではありません。ディレクトリは「テンプレートの名前空間」という意味を持ちます。中に置いてもいいのではないか、と思うかもしれませんね。それは実際には悪い考えです。それらを区別することができません。ディレクトリの中にテンプレートを置いたのは、そういうわけなのです。引用テンプレートファイルについての補足説明ソースコードはGitHubにて各ファイルのソースコードをこの場で書くと煩雑なので、GitHubを参照しながら読み進めてください。いわゆるレイアウト・ファイルです。ヘッダ・フッタ等の共通パーツを切り出しておきます。することが多いようです。いった変数が出現していますが、これらは汎用クラスビューが自動的に埋め込むテンプレート変数です。これはCSRF(クロスサイトリクエストフォージェリ)という攻撃に対するセキュリティ対策です。トークンが外部に漏れ、脆弱性の原因となります。処理時に1点不具合があります。アクセスしてみましょう。新規作成画面のSaveボタンを押して送信すると、下のようなエラー画面になります。Model.(データ保存処理後に)リダイレクトするURLが指定されてません。いうメソッドをモデルに定義しなさい、とのことです。このエラーの対処方法は(おもに)2パターンあります。いうメソッドを実装する方法を採用します。いうインスタンスメソッドを定義し、URL文字列またはDjangoのreverse()関数を通したURLを返します。ここでは単純に記事一覧ページにリダイレクトするよう設定してみました。reverse('blogs:index')※モデルファイルの全ソースはGitHubを参照ください。プロパティを追加して、URLを指定しましょう。汎用ビューの引数として指定する方法も載っています。指定すれば多分うまくいくでしょう。内容を忠実に実践するだけです。目を通しておけば静的ファイルについては十分でしょう。最下部に静的ファイルの設定を追加します。いう階層は不要に感じますが、「静的ファイルの名前空間」という意味があります。中に静的ファイルを置いてもいいのではないか、と思うかもしれませんね。それは実際には悪い考えです。それらを区別することができません。ディレクトリの中にテンプレートを置いたのは、そういうわけなのです。スタイル調整をしているだけの極ふつうのCSSファイルです。このチュートリアルに必要な静的ファイルはCSSファイルだけです。画像は設定しませんが、実装方法はまったく同じです。書くのもとても大変でしたが、読むのも大変だったと思います。お疲れ様でした!このチュートリアルのソースコードとデモサイトは下記より参照可能です。コメントをキャンセルメールアドレスが公開されることはありません。