mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-03 03:50:11 +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`
|
||||
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)
|
||||
kwargs = {self.lookup_field: lookup_field}
|
||||
kwargs = dict(view_kwargs.items() + {self.lookup_field: lookup_field}.items())
|
||||
|
||||
try:
|
||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
except NoReverseMatch:
|
||||
|
@ -369,7 +374,8 @@ class HyperlinkedRelatedField(RelatedField):
|
|||
# Only try pk if it has been explicitly set.
|
||||
# Otherwise, the default `lookup_field = 'pk'` has us covered.
|
||||
pk = obj.pk
|
||||
kwargs = {self.pk_url_kwarg: pk}
|
||||
kwargs = dict(view_kwargs.items() + {self.pk_url_kwarg: pk}.items())
|
||||
|
||||
try:
|
||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
except NoReverseMatch:
|
||||
|
@ -378,7 +384,8 @@ class HyperlinkedRelatedField(RelatedField):
|
|||
slug = getattr(obj, self.slug_field, None)
|
||||
if slug is not None:
|
||||
# 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:
|
||||
ret = reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
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.
|
||||
"""
|
||||
lookup_field = getattr(obj, self.lookup_field, None)
|
||||
kwargs = {self.lookup_field: lookup_field}
|
||||
|
||||
|
||||
# Handle unsaved object case
|
||||
if lookup_field is 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:
|
||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
except NoReverseMatch:
|
||||
|
@ -579,7 +592,8 @@ class HyperlinkedIdentityField(Field):
|
|||
if self.pk_url_kwarg != 'pk':
|
||||
# Only try pk lookup if it has been explicitly set.
|
||||
# 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:
|
||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
except NoReverseMatch:
|
||||
|
@ -588,7 +602,8 @@ class HyperlinkedIdentityField(Field):
|
|||
slug = getattr(obj, self.slug_field, None)
|
||||
if slug:
|
||||
# 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:
|
||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||
except NoReverseMatch:
|
||||
|
|
Loading…
Reference in New Issue
Block a user