【Django】DetailViewの基本・書き方を実例付で解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2021年11月)

「詳細ページのコードを短くしたい!」

「クラスベースビューで詳細ページを作りたい!」

というDjango初学者の方向けの記事になります

当記事を通じて、

  • クラスベースビュー 「DetailView」の書き方
  • 実例コード
  • DetailViewでよく使うメソッド

を解説・紹介していきます

別記事で作成したview関数「nippoDetailView」と同じものをクラスベースビューで作成してきます

def nippoDetailView(request, pk):
     template_name = "nippo/nippo-detail.html"
     ctx = {}
     q = get_object_or_404(NippoModel, pk=pk)
     ctx["object"] = q
     return render(request, template_name, ctx)

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

DetailViewの書き方

DetailViewクラスの記述は、3ステップで完了します

  1. DetailViewクラスのインポート
  2. DetailViewクラスの継承
  3. 「template_name」「model」変数へ値を格納

この3ステップさえ守れば、

  • ブラウザから「pk」を受け取る
  • データベースから「pk」が一致するデータを取り出す
  • コンテキストとしてHTMLテンプレートへ渡す

ことが自動的に行われます

【実例】コードの紹介

早速クラスベースビュー「DetailView」を継承した「NippoDetailView」のコードをご覧ください

from django.views.generic import DetailView

class NippoDetailView(DetailView):
    template_name = "nippo/nippo-detail.html"
    model = NippoModel

1,2,3ステップで完了です!

※urls.pyやテンプレートについては、別記事を参照に設定してください。

ファンクションビューで必要でした、

  • pkの受け取りの記述がいらない
  • contextへオブジェクトを渡す必要がない

という特徴がありますので覚えておきましょう!

また、備わっているメソッドもあり、

「任意の値をコンテキストとして渡したい!」

という「get_context_data」をご紹介します

任意の値をコンテキストで渡す「get_context_dataメソッド」

get_context_dataメソッドでは、

返された値がコンテキストとしてHTMLテンプレートへ渡されます

※ListViewなどほかのクラスベースビューでも使用できるメソッドになります

コード例

使用する機会があるかないかは置いといて、「site_name」という変数に「itc.tokyo」というコンテキストを渡してみます

def get_context_data(self, *args, **kwargs):
        ctx = super().get_context_data(*args, **kwargs)
        ctx["site_name"] = "itc.tokyo"
        return ctx

ポイント

DetailViewでは、自動的に「object」などのコンテキストが用意されていますので、スーパークラスからコンテキストを引き継ぐことを忘れないようにしましょう!

ctx = super().get_context_data(*args, **kwargs)

引き継いだうえで、好きな値をコンテキストで渡していきます

まとめ

DetailViewは他のクラスベースビューに比べて非常にシンプルです

とは言いましても、メソッドの用意はget_context_dataに限りません

詳しくはソースコードにて研究してみてください

次回は、データベースへの保存を担う「クリエイトビュー」の解説を通じて、FormViewの基本についての記事となります

タイトルとURLをコピーしました