Djangoにおいて一覧画面から詳細画面を表示する際、viewで使用するモデルのpkを取得する方法をご紹介します。
条件
- Django 2.1.2
- Python 3.7.0
画面構成
一覧画面と詳細画面がある想定です。
一覧画面で表示される任意のデータをクリックすると、対象データの詳細画面に遷移するものとします。
# urls.py from django.urls import path from . import views app_name = 'monitor' urlpatterns = [ # 一覧画面 path('', views.IndexView.as_view(), name='index'), # 詳細画面 path('monitor/<int:pk>/', views.DetailView.as_view(), name='detail'), ]
viewの設定
get_context_dataにおいて、self.kwargs[‘pk’]でpkを取得します。
# views.py 一部を抜粋 class IndexView(LoginRequiredMixin, generic.ListView): model = Location paginate_by = 5 ordering = ['-updated_at'] template_name = 'monitor/index.html' class DetailView(generic.DetailView): model = Location template_name = 'monitor/detail.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) data_list = Greenhouse.objects.filter(location_id=self.kwargs['pk']) # pkを指定してデータを絞り込む context['greenhouse_data_list'] = data_list return context
参考
DjangoドキュメントのDetail Viewsについての記述です。
https://docs.djangoproject.com/ja/2.1/ref/class-based-views/generic-display/#detailview