mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 04:20:12 +03:00
Make view kwargs available to HyperLinkedIdentityField and HyperlinkedRelatedField
This commit is contained in:
parent
27eb2100f6
commit
3a162b7e33
|
@ -358,8 +358,13 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
|
May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
|
||||||
attributes are not configured to correctly match the URL conf.
|
attributes are not configured to correctly match the URL conf.
|
||||||
"""
|
"""
|
||||||
|
view_kwargs = {}
|
||||||
|
if self.context.get('view'):
|
||||||
|
view_kwargs = self.context['view'].kwargs
|
||||||
|
|
||||||
lookup_field = getattr(obj, self.lookup_field)
|
lookup_field = getattr(obj, self.lookup_field)
|
||||||
kwargs = {self.lookup_field: lookup_field}
|
kwargs = dict(view_kwargs.items() + {self.lookup_field: lookup_field}.items())
|
||||||
|
|
||||||
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:
|
||||||
|
@ -369,7 +374,8 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
# Only try pk if it has been explicitly set.
|
# Only try pk if it has been explicitly set.
|
||||||
# Otherwise, the default `lookup_field = 'pk'` has us covered.
|
# Otherwise, the default `lookup_field = 'pk'` has us covered.
|
||||||
pk = obj.pk
|
pk = obj.pk
|
||||||
kwargs = {self.pk_url_kwarg: pk}
|
kwargs = dict(view_kwargs.items() + {self.pk_url_kwarg: pk}.items())
|
||||||
|
|
||||||
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:
|
||||||
|
@ -378,7 +384,8 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
slug = getattr(obj, self.slug_field, None)
|
slug = getattr(obj, self.slug_field, None)
|
||||||
if slug is not None:
|
if slug is not None:
|
||||||
# Only try slug if it corresponds to an attribute on the object.
|
# Only try slug if it corresponds to an attribute on the object.
|
||||||
kwargs = {self.slug_url_kwarg: slug}
|
kwargs = dict(view_kwargs.items() + {self.slug_url_kwarg: slug}.items())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ret = reverse(view_name, kwargs=kwargs, request=request, format=format)
|
ret = reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||||
if self.slug_field == 'slug' and self.slug_url_kwarg == 'slug':
|
if self.slug_field == 'slug' and self.slug_url_kwarg == 'slug':
|
||||||
|
@ -565,12 +572,18 @@ class HyperlinkedIdentityField(Field):
|
||||||
attributes are not configured to correctly match the URL conf.
|
attributes are not configured to correctly match the URL conf.
|
||||||
"""
|
"""
|
||||||
lookup_field = getattr(obj, self.lookup_field, None)
|
lookup_field = getattr(obj, self.lookup_field, None)
|
||||||
kwargs = {self.lookup_field: lookup_field}
|
|
||||||
|
|
||||||
# Handle unsaved object case
|
# Handle unsaved object case
|
||||||
if lookup_field is None:
|
if lookup_field is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
view_kwargs = {}
|
||||||
|
if self.context.get('view'):
|
||||||
|
view_kwargs = self.context['view'].kwargs
|
||||||
|
|
||||||
|
kwargs = dict(view_kwargs.items() + {self.lookup_field: lookup_field}.items())
|
||||||
|
|
||||||
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:
|
||||||
|
@ -579,7 +592,8 @@ class HyperlinkedIdentityField(Field):
|
||||||
if self.pk_url_kwarg != 'pk':
|
if self.pk_url_kwarg != 'pk':
|
||||||
# Only try pk lookup if it has been explicitly set.
|
# Only try pk lookup if it has been explicitly set.
|
||||||
# Otherwise, the default `lookup_field = 'pk'` has us covered.
|
# Otherwise, the default `lookup_field = 'pk'` has us covered.
|
||||||
kwargs = {self.pk_url_kwarg: obj.pk}
|
kwargs = dict(view_kwargs.items() + {self.pk_url_kwarg: obj.pk}.items())
|
||||||
|
|
||||||
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:
|
||||||
|
@ -588,7 +602,8 @@ class HyperlinkedIdentityField(Field):
|
||||||
slug = getattr(obj, self.slug_field, None)
|
slug = getattr(obj, self.slug_field, None)
|
||||||
if slug:
|
if slug:
|
||||||
# Only use slug lookup if a slug field exists on the model
|
# Only use slug lookup if a slug field exists on the model
|
||||||
kwargs = {self.slug_url_kwarg: slug}
|
kwargs = dict(view_kwargs.items() + {self.slug_url_kwarg: slug}.items())
|
||||||
|
|
||||||
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:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user