与 Django 通用视图中的 pk 不同的 url 路径

Posted

技术标签:

【中文标题】与 Django 通用视图中的 pk 不同的 url 路径【英文标题】:Different url path than pk in Django Generic View 【发布时间】:2020-12-26 03:17:13 【问题描述】:

我正在使用 DetailView 显示一个模板,其中包含我模型中关于我的对象的信息。 我使用 int:pk 作为对象的路径,但现在我想从 detail/XX-ABC(其中 XX-ABC 代表我模型中的唯一字段)之类的东西访问视图。我没有找到一种方法来传递这个 slug 并显示该对象。

path(r'detail/<int:pk>/', views.DetailClientsView.as_view(template_name='clients/clients_details.html',
                                                           context_object_name='client'),name='details_client'),

这是我的观点。

class DetailClientsView(DetailView, UpdateView):
model = Clients
form_class = InspectionForm
def get_success_url(self):
    return reverse('search:search')

【问题讨论】:

你把它命名为slug,或者你在slug_url_kwarg中指定slug。 我试图在我的视图中添加 slug_url_kwarg,但它引发了“无法将关键字 'slug' 解析到字段中。”当我更改 'detail//' 中的路径时 你有两个参数 slug_url_kwargpath(..) 中 slug 的名称,slug_field 是你的 slug 字段的名称模型。 @WillemVanOnsem 谢谢,我错过了使用 slug_field。它帮助了我。 【参考方案1】:

你可以在名为slug的url中指定一个slug:

path(
    'detail/<slug:slug>/',
    views.DetailClientsView.as_view(
        template_name='clients/clients_details.html',
        context_object_name='client'
    ),
    name='details_client'
),

或者你可以给它另一个名字,例如:

path(
    'detail/<slug:client_slug>/',
    views.DetailClientsView.as_view(
        template_name='clients/clients_details.html',
        context_object_name='client'
    ),
    name='details_client'
),

并在视图中指定slug_url_kwarg parameter [Django-doc]:

class DetailClientsView(UpdateView):
    model = Clients
    slug_url_kwarg = 'client_slug'

    # …

如果你的modelSlugField的名字不是slug,你可以设置slug_field attribute [Django-doc]:

class DetailClientsView(UpdateView):
    model = Clients
    slug_url_kwarg = 'client_slug'
    slug_field = 'slugfield_from_model'

    # …

您通常不必必须使用DetailView,因为UpdateView 也会将对象传递给模板。因此,您可能可以将其实现为“纯”UpdateView

【讨论】:

以上是关于与 Django 通用视图中的 pk 不同的 url 路径的主要内容,如果未能解决你的问题,请参考以下文章

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

Django如何使用带有UUID而不是PK的通用视图

django通用视图Generic detail view PublisherList must be called with either an object pk or a slug

必须使用对象 pk 或 slug 调用通用详细视图 ProfileView

通用详细视图 UserProfileDetailView 必须在 URLconf 中使用对象 pk 或 slug 调用

Django 中的自定义与通用视图