better coverage of multiple kwarg url support

This commit is contained in:
Nick Johnson 2013-03-01 12:29:11 -08:00
parent d888228e74
commit 57a6443ee4
3 changed files with 31 additions and 9 deletions

View File

@ -320,6 +320,16 @@ class HyperlinkedRelatedField(RelatedField):
view_name = self.view_name view_name = self.view_name
request = self.context.get('request', None) request = self.context.get('request', None)
format = self.format or self.context.get('format', None) format = self.format or self.context.get('format', None)
pk = getattr(obj, 'pk', None)
if pk is None:
return
kwargs = {self.pk_url_kwarg: pk}
new_kwargs = None
visit = self.context.get('view', None)
if visit:
new_kwargs = kwargs.copy()
new_kwargs.update(visit.kwargs)
if request is None: if request is None:
warnings.warn("Using `HyperlinkedRelatedField` without including the " warnings.warn("Using `HyperlinkedRelatedField` without including the "
@ -327,15 +337,16 @@ class HyperlinkedRelatedField(RelatedField):
"Add `context={'request': request}` when instantiating the serializer.", "Add `context={'request': request}` when instantiating the serializer.",
PendingDeprecationWarning, stacklevel=4) PendingDeprecationWarning, stacklevel=4)
pk = getattr(obj, 'pk', None)
if pk is None:
return
kwargs = {self.pk_url_kwarg: pk}
try: try:
return reverse(view_name, kwargs=kwargs, request=request, format=format) return reverse(view_name, kwargs=kwargs, request=request, format=format)
except NoReverseMatch: except NoReverseMatch:
pass pass
try:
return reverse(view_name, kwargs=new_kwargs, request=request, format=format)
except NoReverseMatch:
pass
slug = getattr(obj, self.slug_field, None) slug = getattr(obj, self.slug_field, None)
if not slug: if not slug:
@ -435,11 +446,12 @@ class HyperlinkedIdentityField(Field):
format = self.context.get('format', None) format = self.context.get('format', None)
view_name = self.view_name or self.parent.opts.view_name view_name = self.view_name or self.parent.opts.view_name
kwargs = {self.pk_url_kwarg: obj.pk} kwargs = {self.pk_url_kwarg: obj.pk}
new_kwargs = None
#get any extra kwargs from the view url and make sure we pass them through to reverse
visit = self.context.get('view', None) visit = self.context.get('view', None)
if visit: if visit:
kwargs.update(visit.kwargs) new_kwargs = kwargs.copy()
new_kwargs.update(visit.kwargs)
if request is None: if request is None:
warnings.warn("Using `HyperlinkedIdentityField` without including the " warnings.warn("Using `HyperlinkedIdentityField` without including the "
@ -464,6 +476,11 @@ class HyperlinkedIdentityField(Field):
except NoReverseMatch: except NoReverseMatch:
pass pass
try:
return reverse(view_name, kwargs=new_kwargs, request=request, format=format)
except NoReverseMatch:
pass
slug = getattr(obj, self.slug_field, None) slug = getattr(obj, self.slug_field, None)
if not slug: if not slug:

View File

@ -80,9 +80,13 @@ class OptionalRelationDetail(generics.RetrieveUpdateDestroyAPIView):
model_serializer_class = serializers.HyperlinkedModelSerializer model_serializer_class = serializers.HyperlinkedModelSerializer
class ExtraKwargDetailSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = ExtraKwargModel
class ExtraKwargDetail(generics.RetrieveUpdateDestroyAPIView): class ExtraKwargDetail(generics.RetrieveUpdateDestroyAPIView):
model = ExtraKwargModel model = ExtraKwargModel
model_serializer_class = serializers.HyperlinkedModelSerializer serializer_class = ExtraKwargDetailSerializer
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'), url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'),
@ -275,7 +279,8 @@ class TestNestedRelationHyperlinkedView(TestCase):
""" """
Create 1 ExtraKwargModel instance. Create 1 ExtraKwargModel instance.
""" """
ExtraKwargModel().save() self.basic = BasicModel.objects.create()
self.model = ExtraKwargModel.objects.create(basic=self.basic)
self.objects = ExtraKwargModel.objects self.objects = ExtraKwargModel.objects
self.detail_view = ExtraKwargDetail.as_view() self.detail_view = ExtraKwargDetail.as_view()

View File

@ -125,7 +125,7 @@ class OptionalRelationModel(RESTFrameworkModel):
# Model to test multiple kwargs in url # Model to test multiple kwargs in url
class ExtraKwargModel(RESTFrameworkModel): class ExtraKwargModel(RESTFrameworkModel):
pass basic = models.ForeignKey(BasicModel)
# Model for RegexField # Model for RegexField
class Book(RESTFrameworkModel): class Book(RESTFrameworkModel):