DjangoのDetailViewのかしこい使い方【Python】
- 作成日: 2020-12-10
- 更新日: 2023-12-26
- カテゴリ: Django
DetailViewの使い方
PythonのWebフレームワークであるDjango(ジャンゴ)には開発者の負担を減らすためのモジュールが多数あります。
DetailView(ディティール・ビュー)はその中の1つです。
DetailViewを使うことでオブジェクトの個別ページの開発コストを減らすことが可能です。
この記事ではDetailViewについて具体的に↓を見ていきます。
- DetailViewの概要
- モデルの作成
- オブジェクトの作成
- DetailVeiwによるビューの作成
- その他のDetailViewの機能
前提
今回はアプリケーションであるmyapp
というアプリを作成しておきます。
python manage.py startapp
などでこのアプリを作成してある想定です。
DetailViewの概要
DetailViewは個別のオブジェクトを表示するためのビューで、クラスです。
DetailViewはdjango.views.generic
で定義されています。
そのためDetailViewを使う場合はdjango.views.generic
からDetailView
クラスをインポートします。
ビューを作るには、DetailView
クラスを継承したクラスを作ります。
そしてそのクラスにモデルを設定すると、クラスはそのモデルを使ってオブジェクトを取得します。
そしてクラスはそのオブジェクトをテンプレートファイルに渡します。
DetailViewの設定で必須なのはこのモデルの設定だけで、あとは自動でセットアップされます。
詳細に設定したい場合はクラスの属性やメソッドを定義することで可能になっています。
DetailViewはただのビューなので、このビューを使うにはurls.py
の編集やモデルの作成、それからテンプレートファイルの作成が必要になります。
またDetailViewの他にもdjango.views.generic
にはいろいろなビューが置かれています。
モデルの作成
今回の解説用にモデルを作ります。
モデルは人物を表現するモデルです。
このモデルには名前を表すname
フィールドや年齢を表すage
フィールドを作っておきます。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
age = models.IntegerField()
このモデルをDetailViewに渡すことでビューが機能するようになります。
オブジェクトの作成
モデルを作成したらDjangoのシェルを使ってデータベースにオブジェクトを作成します。
↓のようにDjangoのシェルを起動します。
python manage.py shell
そして↓のコードを実行し、オブジェクトを作成します。
from myapp.models import Person
Person.objects.create(name='Taro', age=20)
Person.objects.create(name='Hanako', age=18)
Person.objects.create(name='Kenji', age=28)
DetailVeiwによるビューの作成
ではDetailViewでビューを作成します。
アプリケーションのviews.py
を↓のように編集します。
from django.views.generic import DetailView
from .models import Person
class PersonDetail(DetailView):
model = Person
ひとつずつ見ていきます。
まず↓のようにDetailView
をdjango.views.generic
からインポートします。
from django.views.generic import DetailView
そして↓のように先ほど作成したPerson
モデルもインポートします。
from .models import Person
↓のようにPersonDetail
というクラスを作成します。
このクラスはDetailView
クラスを継承するようにします。
そしてクラスの属性model
にPerson
モデルをセットします。
class PersonDetail(DetailView):
model = Person
ビューの作成はこれだけでOKです。あとは自動でやってくれます。
🦝 < かんたん!
urls.pyの編集
プロジェクトのurls.py
を↓のように編集します。
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('persons/detail/<int:pk>/', views.PersonDetail.as_view()),
]
今回はpersons/detail/<int:pk>/
にビューをセットします。
<int:pk>
はオブジェクトのIDが指定されます。
DetailViewを継承したクラスはas_view()
というメソッドが使えます。
このメソッドを使うとpath()
に設定可能なビューを取得することが出来ます。
テンプレートファイルの作成
DetailViewはデフォルトでは「アプリ名/ビュー名.html
」のテンプレートファイルを参照します。
さきほどPersonDetail
というビューを作りましたが、このビューの場合はビュー名がPersonDetail
でアプリ名がmyapp
なので、テンプレートファイルは「myapp/person_detail.html
」になります。
これはmyapp/templates/myapp/person_detail.html
のことです。
このテンプレートファイルを↓のような内容で作成します。
<p>Name: {{ object.name }}, Age: {{ object.age }}</p>
DetailViewはデフォルトで取得したオブジェクトをobject
という変数名でコンテキストに保存します。
そのため↑のようにobject
を参照することでオブジェクトにアクセスすることができます。
↑の例ではPerson
オブジェクトのname
とage
フィールドを参照しています。
ビューとurls.py
とテンプレートファイルを作ったので開発用サーバーを起動し、/persons/detail/1/
にアクセスします。
すると↓のような画面が表示されます。
その他のDetailViewの機能
DetailViewには他にも↓のような機能があります。
コンテキスト内の変数を別の名前に変更する
テンプレートファイルでobject
という変数を参照していましたが、このobject
という変数名を変更したい場合があります。
そういう時は↓のようにビューのcontext_object_name
属性に名前を設定することで変更が可能です。
from django.views.generic import DetailView
from .models import Person
class PersonDetail(DetailView):
model = Person
context_object_name = 'person'
↑のようにcontext_object_name
にperson
という文字列を設定しました。
これでテンプレートファイル内ではperson
という変数名でオブジェクトを参照することが出来ます。
<p>Name: {{ person.name }}, Age: {{ person.age }}</p>
コンテキストを動的に取得し設定する
ビューの取得しているコンテキストを編集したい場合があります。
そういう時は↓のようにget_context_data()
メソッドを定義(オーバーライド)します。
↓はコンテキストにmessage
という変数を作っているところです。
from django.views.generic import DetailView
from .models import Person
class PersonDetail(DetailView):
model = Person
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['message'] = 'Hello, World!'
return context
get_context_data()
内で親のget_context_data()
を呼び出すと、コンテキストを取得することが出来ます。
そのコンテキストにデータを設定し、return
でコンテキストを返せば、テンプレートファイルに渡すコンテキストを編集することが出来ます。
<p>{{ message }}</p>
<p>Name: {{ person.name }}, Age: {{ person.age }}</p>
テンプレートファイル名を変更する
DetailViewの参照するテンプレートファイルのパスを変更したい場合はクラスの属性template_name
にパスを設定します。
from django.views.generic import DetailView
from .models import Person
class PersonDetail(DetailView):
model = Person
template_name = 'myapp/my_detail.html'
↑の場合、PersonDetailビューはmyapp/my_detail.html
を参照するようになります。
おわりに
DetailViewを使えば個別のオブジェクトの表示の手間を減らすことが出来ます。
活用すれば開発が楽になるかもしれません。
🦝 < オブジェクトの詳細をちょうだい
🐭 < 韻を踏んでらっしゃる