与 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_kwarg
是 path(..)
中 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'
# …
如果你的model中SlugField
的名字不是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通用视图Generic detail view PublisherList must be called with either an object pk or a slug
必须使用对象 pk 或 slug 调用通用详细视图 ProfileView