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

Different url path than pk in Django Generic View

我正在使用 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')

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

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

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

path(
    'detail/<<b>slug:client_slug</b>>/',
    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
    <b>slug_url_kwarg = 'client_slug'</b>

    # …

如果您的 模型 中的 SlugField 名称不是 slug,您可以设置 slug_field attribute [Django-doc]:

class DetailClientsView(UpdateView):
    model = Clients
    slug_url_kwarg = 'client_slug'
    <b>slug_field = 'slugfield_from_model'</b>

    # …

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