mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-27 08:29:59 +03:00
better coverage of multiple kwarg url support
This commit is contained in:
parent
d888228e74
commit
57a6443ee4
|
@ -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:
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user