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の記載漏れがないか確認してみましょう。
コメントを残す