@@ -151,6 +151,34 @@ def need_python_sorting(self, queryset, ordering):
151151
152152 return field not in field_names
153153
154+ def sort_queryset (self , queryset , ordering ):
155+ if not ordering :
156+ return queryset
157+
158+ if queryset .exists ():
159+ if self .need_python_sorting (queryset , ordering ):
160+ # Fallback on pure Python sorting (much slower on large data)
161+
162+ # The field name can be prefixed by the minus sign and we need to
163+ # extract this information if we want to sort on simple object
164+ # attributes (non-model fields)
165+ if ordering [0 ] == '-' :
166+ if len (ordering ) == 1 :
167+ # Prefix without field name
168+ raise template .TemplateSyntaxError
169+
170+ reverse = True
171+ name = ordering [1 :]
172+ else :
173+ reverse = False
174+ name = ordering
175+ if hasattr (queryset [0 ], name ):
176+ return sorted (queryset , key = attrgetter (name ), reverse = reverse )
177+ else :
178+ raise AttributeError ()
179+ else :
180+ return queryset .order_by (ordering )
181+
154182 def render (self , context ):
155183 if self .context_var is not None :
156184 key = self .context_var
@@ -160,38 +188,13 @@ def render(self, context):
160188 queryset = self .queryset_var .resolve (context )
161189 ordering = get_sort_field (context ['request' ])
162190
163- if ordering :
164- try :
165- if queryset .exists ():
166- if self .need_python_sorting (queryset , ordering ):
167- # Fallback on pure Python sorting (much slower on large data)
168-
169- # The field name can be prefixed by the minus sign and we need to
170- # extract this information if we want to sort on simple object
171- # attributes (non-model fields)
172- if ordering [0 ] == '-' :
173- if len (ordering ) == 1 :
174- raise template .TemplateSyntaxError
175-
176- reverse = True
177- name = ordering [1 :]
178- else :
179- reverse = False
180- name = ordering
181- if hasattr (queryset [0 ], name ):
182- context [key ] = sorted (queryset , key = attrgetter (name ), reverse = reverse )
183- else :
184- raise AttributeError ()
185- else :
186- context [key ] = queryset .order_by (ordering )
187- except (template .TemplateSyntaxError , AttributeError ):
188- # Seems spurious to me...
189- if INVALID_FIELD_RAISES_404 :
190- raise Http404 (
191- 'Invalid field sorting. If DEBUG were set to '
192- 'False, an HTTP 404 page would have been shown instead.' )
193- context [key ] = queryset
194- else :
191+ try :
192+ context [key ] = self .sort_queryset (queryset , ordering )
193+ except (template .TemplateSyntaxError , AttributeError ):
194+ if INVALID_FIELD_RAISES_404 :
195+ raise Http404 (
196+ 'Invalid field sorting. If DEBUG were set to '
197+ 'False, an HTTP 404 page would have been shown instead.' )
195198 context [key ] = queryset
196199
197200 return u''
0 commit comments