サイトアイコン 知的好奇心

Djangoのviewでurlのpkを取得する方法

Djangoにおいて一覧画面から詳細画面を表示する際、viewで使用するモデルのpkを取得する方法をご紹介します。

条件

画面構成

一覧画面と詳細画面がある想定です。
一覧画面で表示される任意のデータをクリックすると、対象データの詳細画面に遷移するものとします。

# 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

モバイルバージョンを終了