Djangoのviewでurlのpkを取得する方法
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


