diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 9aa1d5906..a7652db0c 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -529,6 +529,8 @@ class HyperlinkedRelatedField(RelatedField): self.view_name = kwargs.pop('view_name') except: raise ValueError("Hyperlinked field requires 'view_name' kwarg") + + self.view_namespace = kwargs.pop('view_namespace', None) self.slug_field = kwargs.pop('slug_field', self.slug_field) default_slug_kwarg = self.slug_url_kwarg or self.slug_field @@ -545,7 +547,11 @@ class HyperlinkedRelatedField(RelatedField): return self.slug_field def to_native(self, obj): + view_namespace = self.view_namespace view_name = self.view_name + if view_namespace: + view_name = '%(namespace)s:%(name)' % {'namespace': view_namespace, 'name':view_name} + request = self.context.get('request', None) format = self.format or self.context.get('format', None) pk = getattr(obj, 'pk', None) @@ -564,13 +570,13 @@ class HyperlinkedRelatedField(RelatedField): kwargs = {self.slug_url_kwarg: slug} try: - return reverse(self.view_name, kwargs=kwargs, request=request, format=format) + return reverse(view_name, kwargs=kwargs, request=request, format=format) except: pass kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug} try: - return reverse(self.view_name, kwargs=kwargs, request=request, format=format) + return reverse(view_name, kwargs=kwargs, request=request, format=format) except: pass @@ -639,6 +645,8 @@ class HyperlinkedIdentityField(Field): except: raise ValueError("Hyperlinked Identity field requires 'view_name' kwarg") + self.view_namespace = kwargs.pop('view_namespace', None) + self.format = kwargs.pop('format', None) self.slug_field = kwargs.pop('slug_field', self.slug_field) @@ -651,7 +659,11 @@ class HyperlinkedIdentityField(Field): def field_to_native(self, obj, field_name): request = self.context.get('request', None) format = self.format or self.context.get('format', None) - view_name = self.view_name or self.parent.opts.view_name + view_namespace = self.view_namespace + view_name = self.view_name + if view_namespace: + view_name = '%(namespace)s:%(name)' % {'namespace': view_namespace, 'name':view_name} + kwargs = {self.pk_url_kwarg: obj.pk} try: return reverse(view_name, kwargs=kwargs, request=request, format=format) @@ -665,13 +677,13 @@ class HyperlinkedIdentityField(Field): kwargs = {self.slug_url_kwarg: slug} try: - return reverse(self.view_name, kwargs=kwargs, request=request, format=format) + return reverse(view_name, kwargs=kwargs, request=request, format=format) except: pass kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug} try: - return reverse(self.view_name, kwargs=kwargs, request=request, format=format) + return reverse(view_name, kwargs=kwargs, request=request, format=format) except: pass diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 80eefbf08..a15b4ef67 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -519,6 +519,7 @@ class HyperlinkedModelSerializerOptions(ModelSerializerOptions): def __init__(self, meta): super(HyperlinkedModelSerializerOptions, self).__init__(meta) self.view_name = getattr(meta, 'view_name', None) + self.view_namespace = getattr(meta, 'view_namespace', None) class HyperlinkedModelSerializer(ModelSerializer): @@ -531,7 +532,7 @@ class HyperlinkedModelSerializer(ModelSerializer): if self.opts.view_name is None: self.opts.view_name = self._get_default_view_name(self.opts.model) - self.base_fields.insert(0, 'url', HyperlinkedIdentityField(view_name=self.opts.view_name)) + self.base_fields.insert(0, 'url', HyperlinkedIdentityField(view_name=self.opts.view_name, view_namespace=self.opts.view_namespace)) super(HyperlinkedModelSerializer, self).__init__(*args, **kwargs)