Commit 22e1950e by Tom Christie

Backwards compatible approach to HyperlinkedIdentityField URLs. Closes #892

parent 138f0cac
...@@ -518,8 +518,6 @@ class HyperlinkedIdentityField(Field): ...@@ -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): ...@@ -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
slug = getattr(obj, self.slug_field, None) if self.pk_url_kwarg != 'pk':
# Only try pk lookup if it has been explicitly set.
if not slug: # Otherwise, the default `lookup_field = 'pk'` has us covered.
raise Exception('Could not resolve URL for field using view name "%s"' % view_name) kwargs = {self.pk_url_kwarg: obj.pk}
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} slug = getattr(obj, self.slug_field, None)
try: if slug:
return reverse(view_name, kwargs=kwargs, request=request, format=format) # Only use slug lookup if a slug field exists on the model
except NoReverseMatch: kwargs = {self.slug_url_kwarg: slug}
pass 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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment