Add lookup_kwarg

This commit is contained in:
Tom Christie 2013-04-09 19:01:01 +01:00
parent 099163f81f
commit dc45bc7bfa
2 changed files with 15 additions and 9 deletions

View File

@ -26,6 +26,7 @@ class GenericAPIView(views.APIView):
pagination_serializer_class = api_settings.DEFAULT_PAGINATION_SERIALIZER_CLASS pagination_serializer_class = api_settings.DEFAULT_PAGINATION_SERIALIZER_CLASS
allow_empty = True allow_empty = True
page_kwarg = 'page' page_kwarg = 'page'
lookup_kwarg = 'pk'
# Pending deprecation # Pending deprecation
model = None model = None
@ -167,23 +168,26 @@ class GenericAPIView(views.APIView):
By default this requires `self.queryset` and a `pk` or `slug` argument By default this requires `self.queryset` and a `pk` or `slug` argument
in the URLconf, but subclasses can override this to return any object. in the URLconf, but subclasses can override this to return any object.
""" """
# Use a custom queryset if provided; this is required for subclasses # Determine the base queryset to use.
# like DateDetailView
if queryset is None: if queryset is None:
queryset = self.get_queryset() queryset = self.get_queryset()
# Next, try looking up by primary key.
# Perform the lookup filtering.
pk = self.kwargs.get(self.pk_url_kwarg, None) pk = self.kwargs.get(self.pk_url_kwarg, None)
slug = self.kwargs.get(self.slug_url_kwarg, None) slug = self.kwargs.get(self.slug_url_kwarg, None)
if pk is not None: lookup = self.kwargs.get(self.lookup_kwarg, None)
if lookup is not None:
queryset = queryset.filter(**{self.lookup_kwarg: lookup})
elif pk is not None:
queryset = queryset.filter(pk=pk) queryset = queryset.filter(pk=pk)
# Next, try looking up by slug.
elif slug is not None: elif slug is not None:
queryset = queryset.filter(**{self.slug_field: slug}) queryset = queryset.filter(**{self.slug_field: slug})
# If none of those are defined, it's an error.
else: else:
raise AttributeError("Generic detail view %s must be called with " raise AttributeError("Generic detail view %s must be called with "
"either an object pk or a slug." "either an object pk or a slug."
% self.__class__.__name__) % self.__class__.__name__)
try: try:
# Get the single item from the filtered queryset # Get the single item from the filtered queryset
obj = queryset.get() obj = queryset.get()
@ -191,7 +195,9 @@ class GenericAPIView(views.APIView):
raise Http404(_("No %(verbose_name)s found matching the query") % raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name}) {'verbose_name': queryset.model._meta.verbose_name})
# May raise a permission denied
self.check_object_permissions(self.request, obj) self.check_object_permissions(self.request, obj)
return obj return obj