(最終更新月: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)
DetailViewの書き方
DetailViewクラスの記述は、3ステップで完了します
- DetailViewクラスのインポート
- DetailViewクラスの継承
- 「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の基本についての記事となります