def get_url(self, obj, view_name, request, format): """ Given an object, return the URL that hyperlinks to the object. May raise a `NoReverseMatch` if the `view_name` and `lookup_field` attributes are not configured to correctly match the URL conf. """ defaults = {} if self.parent.opts.defaults: defaults.update(self.parent.opts.defaults) if self.defaults: defaults.update(self.defaults) lookup_field = getattr(obj, self.lookup_field) kwargs = {self.lookup_field: lookup_field} kwargs.update(defaults) try: return reverse(view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: 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} kwargs.update(defaults) try: return reverse(view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: pass 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.update(defaults) try: return reverse(view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: pass raise NoReverseMatch()
def field_to_native(self, obj, field_name): defaults = {} if self.parent.opts.defaults: defaults.update(self.parent.opts.defaults) if self.defaults: defaults.update(self.defaults) if self.pk_query_kwarg: request = self.context.get('request', None) format = self.format or self.context.get('format', None) #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace view_name = self.view_name or self.parent.opts.view_name #if view_namespace: # view_name = "%(namespace)s:%(view)s" % { # 'view':view_name, # 'namespace':view_namespace # } pk = getattr(obj, 'pk') try: url = reverse(view_name, kwargs=defaults, request=request, format=format) return "%(url)s?%(query_kwarg)s=%(query_value)s" % { 'url': url, 'query_kwarg': self.pk_query_kwarg, 'query_value': pk } except NoReverseMatch: pass raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) elif self.slug_query_kwarg: request = self.context.get('request', None) format = self.format or self.context.get('format', None) #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace view_name = self.view_name or self.parent.opts.view_name #if view_namespace: # view_name = "%(namespace)s:%(view)s" % { # 'view':view_name, # 'namespace':view_namespace # } slug = getattr(obj, self.slug_field, None) if not slug: raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) try: url = reverse(view_name, kwargs=defaults, request=request, format=format) return "%(url)s?%(query_kwarg)s=%(query_value)s" % { 'url': url, 'query_kwarg': self.slug_query_kwarg, 'query_value': slug } except NoReverseMatch: pass raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) else: 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 kwargs = {self.pk_url_kwarg: obj.pk} kwargs.update(defaults) try: return reverse(view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: pass kwargs = {} for key, value in self.url_kwarg_lookup.items(): kwargs[key] = value(obj) if hasattr(value, '__call__') else getattr(obj, value, None) kwargs.update(defaults) try: return reverse(self.view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: pass slug = getattr(obj, self.slug_field, None) if not slug: raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) kwargs = {self.slug_url_kwarg: slug} kwargs.update(defaults) try: return reverse(self.view_name, kwargs=kwargs, request=request, format=format) except NoReverseMatch: 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) except NoReverseMatch: pass raise ValidationError('Could not resolve URL for field using view name "%s"', view_name)
def field_to_native(self, obj, field_name): if self.pk_query_kwarg: request = self.context.get('request', None) format = self.format or self.context.get('format', None) #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace view_name = self.view_name or self.parent.opts.view_name #if view_namespace: # view_name = "%(namespace)s:%(view)s" % { # 'view':view_name, # 'namespace':view_namespace # } pk = getattr(obj, 'pk') try: url = reverse(view_name, request=request, format=format) return "%(url)s?%(query_kwarg)s=%(query_value)s" % { 'url': url, 'query_kwarg': self.pk_query_kwarg, 'query_value': pk } except: pass raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) elif self.slug_query_kwarg: request = self.context.get('request', None) format = self.format or self.context.get('format', None) #view_namespace = self.view_namespace if self.view_namespace is not None else self.parent.opts.view_namespace view_name = self.view_name or self.parent.opts.view_name #if view_namespace: # view_name = "%(namespace)s:%(view)s" % { # 'view':view_name, # 'namespace':view_namespace # } slug = getattr(obj, self.slug_field, None) if not slug: raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) try: url = reverse(view_name, request=request, format=format) return "%(url)s?%(query_kwarg)s=%(query_value)s" % { 'url': url, 'query_kwarg': self.slug_query_kwarg, 'query_value': slug } except: pass raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) else: 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 kwargs = {self.pk_url_kwarg: obj.pk} try: return reverse(view_name, kwargs=kwargs, request=request, format=format) except: pass slug = getattr(obj, self.slug_field, None) if not slug: raise ValidationError('Could not resolve URL for field using view name "%s"' % view_name) kwargs = {self.slug_url_kwarg: slug} try: return reverse(self.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) except: pass raise ValidationError('Could not resolve URL for field using view name "%s"', view_name)