mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-06-06 14:43:06 +03:00
Backwards compatible approach to HyperlinkedIdentityField URLs. Closes #892
This commit is contained in:
parent
138f0cacdb
commit
22e1950e1c
|
@ -518,8 +518,6 @@ class HyperlinkedIdentityField(Field):
|
||||||
request = self.context.get('request', None)
|
request = self.context.get('request', None)
|
||||||
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
|
||||||
lookup_field = getattr(obj, self.lookup_field)
|
|
||||||
kwargs = {self.lookup_field: lookup_field}
|
|
||||||
|
|
||||||
if request is None:
|
if request is None:
|
||||||
warnings.warn("Using `HyperlinkedIdentityField` without including the "
|
warnings.warn("Using `HyperlinkedIdentityField` without including the "
|
||||||
|
@ -539,27 +537,30 @@ class HyperlinkedIdentityField(Field):
|
||||||
if format and self.format and self.format != format:
|
if format and self.format and self.format != format:
|
||||||
format = self.format
|
format = self.format
|
||||||
|
|
||||||
|
lookup_field = getattr(obj, self.lookup_field)
|
||||||
|
kwargs = {self.lookup_field: lookup_field}
|
||||||
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
|
||||||
|
|
||||||
|
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}
|
||||||
|
try:
|
||||||
|
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||||
|
except NoReverseMatch:
|
||||||
|
pass
|
||||||
|
|
||||||
slug = getattr(obj, self.slug_field, None)
|
slug = getattr(obj, self.slug_field, None)
|
||||||
|
if slug:
|
||||||
if not slug:
|
# Only use slug lookup if a slug field exists on the model
|
||||||
raise Exception('Could not resolve URL for field using view name "%s"' % view_name)
|
kwargs = {self.slug_url_kwarg: slug}
|
||||||
|
try:
|
||||||
kwargs = {self.slug_url_kwarg: slug}
|
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||||
try:
|
except NoReverseMatch:
|
||||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
pass
|
||||||
except NoReverseMatch:
|
|
||||||
pass
|
|
||||||
|
|
||||||
kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug}
|
|
||||||
try:
|
|
||||||
return reverse(view_name, kwargs=kwargs, request=request, format=format)
|
|
||||||
except NoReverseMatch:
|
|
||||||
pass
|
|
||||||
|
|
||||||
raise Exception('Could not resolve URL for field using view name "%s"' % view_name)
|
raise Exception('Could not resolve URL for field using view name "%s"' % view_name)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user