首页 > 解决方案 > Django:DetailView 和多个 slug

问题描述

我的 DetailView 有问题。我想确保两个值都在 url 字符串中,然后想要显示页面。但是我总是在这里收到这个错误:

KeyError at /orders/ticket/ug2dc78agz-1/d04fkjmo37/
'order_reference'

视图.py

class TicketView(DetailView):
    model = Attendee
    template_name = 'orders/ticket_view.html'

    def get_queryset(self):
        return Attendee.objects.filter(
            order__order_reference=self.kwargs['order_reference'],
        ).filter(
            access_key=self.kwargs['access_key'],
        )

网址.py

urlpatterns = [
    path(
        'ticket/<slug:ticket_reference>/<slug:access_key>/',
        TicketView.as_view(),
        name='ticket'
    ),
]

标签: pythondjangodjango-class-based-views

解决方案


您收到错误是因为您尝试访问self.kwargs['order_reference'],但您没有order_referencepath().

你的path()用途,

'ticket/<slug:ticket_reference>/<slug:access_key>/'

因此您可以使用self.kwargs['ticket_reference']and self.kwargs['access_key']

由于您的路径不包含slugor pk,Django 将不知道如何获取详细视图的对象。我会覆盖get_object而不是get_queryset

def get_object(self):
    return get_object_or_404(
        Attendee,
        order__order_reference=self.kwargs['slug:ticket_reference'],
        access_key=self.kwargs['access_key'],
    )

推荐阅读