user9252255
user9252255

Reputation:

Django: DetailView and multiple slugs

I have an issue with my DetailView. I want to make sure both values are in the url string and then want to display the page. However I am always receiving this error here:

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

views.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'],
        )

urls.py

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

Upvotes: 2

Views: 2192

Answers (2)

Alasdair
Alasdair

Reputation: 309109

You get the error because you are trying to access self.kwargs['order_reference'], but you don't use order_reference in the path().

Your path() uses,

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

therefore you can use self.kwargs['ticket_reference'] and self.kwargs['access_key'].

Since your path does not contain slug or pk, Django will not know how to fetch the object for the detail view. I would override get_object instead of 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'],
    )

Upvotes: 3

neverwalkaloner
neverwalkaloner

Reputation: 47374

You have ticket_reference url variable, but in view using order_reference. You should rename it:

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

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

Upvotes: 1

Related Questions