From ac5f4e84754e0011a36f3b6438d830d770dd1882 Mon Sep 17 00:00:00 2001 From: Camille Harang Date: Thu, 6 Oct 2016 15:04:42 +0200 Subject: [PATCH] Fix rest_framework.filters.OrderingFilter doesn't pass context to serializers #4541 --- rest_framework/filters.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index aaf313491..b8d6d4535 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -265,7 +265,7 @@ class OrderingFilter(BaseFilterBackend): return (ordering,) return ordering - def get_default_valid_fields(self, queryset, view): + def get_default_valid_fields(self, queryset, view, context={}): # If `ordering_fields` is not specified, then we determine a default # based on the serializer class, if one exists on the view. if hasattr(view, 'get_serializer_class'): @@ -288,16 +288,16 @@ class OrderingFilter(BaseFilterBackend): return [ (field.source or field_name, field.label) - for field_name, field in serializer_class().fields.items() + for field_name, field in serializer_class(context=context).fields.items() if not getattr(field, 'write_only', False) and not field.source == '*' ] - def get_valid_fields(self, queryset, view): + def get_valid_fields(self, queryset, view, context={}): valid_fields = getattr(view, 'ordering_fields', self.ordering_fields) if valid_fields is None: # Default to allowing filtering on serializer fields - return self.get_default_valid_fields(queryset, view) + return self.get_default_valid_fields(queryset, view, context) elif valid_fields == '__all__': # View explicitly allows filtering on any model field @@ -332,15 +332,16 @@ class OrderingFilter(BaseFilterBackend): current = self.get_ordering(request, queryset, view) current = None if current is None else current[0] options = [] - for key, label in self.get_valid_fields(queryset, view): - options.append((key, '%s - %s' % (label, _('ascending')))) - options.append(('-' + key, '%s - %s' % (label, _('descending')))) - return { + context = { 'request': request, 'current': current, 'param': self.ordering_param, - 'options': options, } + for key, label in self.get_valid_fields(queryset, view, context): + options.append((key, '%s - %s' % (label, _('ascending')))) + options.append(('-' + key, '%s - %s' % (label, _('descending')))) + context['options'] = options + return context def to_html(self, request, queryset, view): template = loader.get_template(self.template)