📜  “必须在 URLconf 中使用对象 pk 或 slug 调用”- Python (1)

📅  最后修改于: 2023-12-03 15:21:25.673000             🧑  作者: Mango

“必须在 URLconf 中使用对象 pk 或 slug 调用”- Python

当你在 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 来调用,否则就会遇到上面的错误提示。