diff options
| author | Stephan Groß | 2012-11-06 17:02:34 +0100 |
|---|---|---|
| committer | Stephan Groß | 2012-11-06 17:02:34 +0100 |
| commit | 2c52a2581f690eca62a203d9b5344ac39b43ba74 (patch) | |
| tree | 95a3d5ed5bf07246e4b78cbbfcf829eb152f541d /rest_framework/fields.py | |
| parent | 4f5a6fca64bb428ed13a639eae59bc4197939449 (diff) | |
| download | django-rest-framework-2c52a2581f690eca62a203d9b5344ac39b43ba74.tar.bz2 | |
added slug support for HyperlinkedIdentityField
Diffstat (limited to 'rest_framework/fields.py')
| -rw-r--r-- | rest_framework/fields.py | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index e194690d..1b1f57db 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -599,20 +599,50 @@ class HyperlinkedIdentityField(Field): """ Represents the instance, or a property on the instance, using hyperlinking. """ + pk_url_kwarg = 'pk' + slug_field = 'slug' + slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden def __init__(self, *args, **kwargs): # TODO: Make view_name mandatory, and have the # HyperlinkedModelSerializer set it on-the-fly self.view_name = kwargs.pop('view_name', None) self.format = kwargs.pop('format', None) + + self.slug_field = kwargs.pop('slug_field', self.slug_field) + default_slug_kwarg = self.slug_url_kwarg or self.slug_field + self.slug_url_kwarg = kwargs.pop('slug_url_kwarg', default_slug_kwarg) + super(HyperlinkedIdentityField, self).__init__(*args, **kwargs) def field_to_native(self, obj, field_name): 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 - view_kwargs = {'pk': obj.pk} - return reverse(view_name, kwargs=view_kwargs, request=request, format=format) + 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) ##### Typed Fields ##### |
