Django DetailViewでpkやslugが必要だという例外が発生した時の対処法

DjangoのDetailViewを利用すると次の様なAttributeError例外が発生する事があります。

Generic detail view <classname> must be called with either an object pk or a slug in the URLconf.

これはURLconfにpkやslugを指定していない場合に発生します。

今回はこの例外の発生原因と対処法を紹介します。

例外の発生原因

次の様にユーザーの詳細ページ用のUserDetailViewクラスを定義しているとします。

from django.contrib.auth.models import User
from django.views.generic.detail import DetailView

class UserDetailView(DetailView):
    model = User
    queryset = User.objects.all()
    template_name='accounts/detail.html'

次の様にURLconfでURLとUserDetailViewを紐付けます。

from django.urls import path
from accounts import views

urlpatterns = [
    path('detail/<int:pk>', views.UserDetailView.as_view(), name='detail'),
]

DetailViewでどのモデルの詳細を表示するか定義し、URLconfで表示するデータを定義します。

表示したいデータをpkで指定する場合は、’detail/<int:pk>’の様に書きます。

スラッグを使っている場合はパスにslugを使う事もできます。

path('detail/<slug:slug>', views.UserDetailView.as_view(), name='detail')

pkやslugを使っていない場合、例外が発生します。

AttributeError: Generic detail view UserDetailView must be called with either an object pk or a slug in the URLconf.

(翻訳)
ジェネリック詳細ビュー<classname>はURLconfにオブジェクトのpkやslugを含めて呼びだす必要があります。

対処法

URLconfにpkやslugの記載漏れがないか確認してみましょう。

スポンサーリンク
スポンサーリンク