📅  最后修改于: 2023-12-03 15:21:25.673000             🧑  作者: Mango
当你在 Django 项目中的视图函数中使用了通用视图的 DetailView
时,你可能会遇到如下错误提示:
AttributeError at /example/1/
Generic detail view ExampleDetailView must be called with either an object pk or a slug in the URLconf.
这个错误提示告诉你 DetailView
必须在 URLconf 中使用对象的主键(pk)或者 slug 来调用。那么,怎么理解这个错误提示呢?我们可以先了解一下 Django 中的通用视图和 URLconf。
通用视图是 Django 中用来处理常见页面(比如列表、详情等)逻辑的类视图。这些类视图像模板一样封装了常见的页面逻辑,通过继承它们可以快速构建复杂的视图。URLconf,即 URL 配置,是 Django 中用于将 URL 映射到对应的视图函数或类视图的配置文件。通俗的说,就是告诉 Django 什么样的 URL 请求会被哪个视图函数或类视图处理。
回到我们的问题上来,为什么会出现这个错误提示呢?原因是在调用 DetailView
时,没有在 URLconf 中传递对象的主键或者 slug。比如,我们在 URLconf 中配置了以下 URL:
from django.urls import path
from .views import ExampleDetailView
urlpatterns = [
path('example/', ExampleDetailView.as_view(), name='example-detail'),
]
这个 URL 配置告诉 Django 当访问 /example/
时使用 ExampleDetailView
处理,但是它并没有指定要处理哪个具体的对象。而 DetailView
需要根据 URL 里的主键或者 slug 参数来加载对应的对象。所以,我们需要在 URLconf 中指定对象的主键或者 slug 参数。比如,在上面的 URL 配置中,如果我们要处理 id 为 1 的 Example 对象,应该这样写:
from django.urls import path
from .views import ExampleDetailView
urlpatterns = [
path('example/<int:pk>/', ExampleDetailView.as_view(), name='example-detail'),
]
这样,当访问 /example/1/
时,Django 就会调用 ExampleDetailView
并指定要加载 id 为 1 的 Example 对象。如果你想使用 slug,可以这样配置:
from django.urls import path
from .views import ExampleDetailView
urlpatterns = [
path('example/<slug:slug>/', ExampleDetailView.as_view(), name='example-detail'),
]
这样,当访问 /example/some-example-slug/
时,Django 就会调用 ExampleDetailView
并指定要加载 slug 为 some-example-slug
的 Example 对象。
综上所述,当你在使用 DetailView
时,务必在 URLconf 中使用对象的主键或者 slug 来调用,否则就会遇到上面的错误提示。