Skip to content

Generalization of 'autosort' tag for iterables. #8

@trybik

Description

@trybik

Right now 'autosort' tag assumes that what is passed as an var is a queryset. I guess this assumption could be relaxed a bit to any iterables. The solution below (diff) works well for me.

diff -crB django_sorting-old/templatetags/sorting_tags.py django_sorting/templatetags/sorting_tags.py                     
*** django_sorting-old/templatetags/sorting_tags.py     2010-02-20 18:56:52.000000000 +0100                               
--- django_sorting/templatetags/sorting_tags.py 2010-02-20 19:03:45.000000000 +0100                                       
***************                                                                                                           
*** 1,6 ****                                                                                                              
--- 1,8 ----                                                                                                              
  from django import template                                                                                             
  from django.http import Http404                                                                                         
  from django.conf import settings                                                                                        
+ from django.db.models.query import QuerySet                                                                             
+ from operator import attrgetter                                                                                         
                                                                                                                          
  register = template.Library()                                                                                           

***************
*** 96,102 ****
          order_by = context['request'].field
          if len(order_by) > 1:
              try:
!                 context[key] = value.order_by(order_by)
              except template.TemplateSyntaxError:
                  if INVALID_FIELD_RAISES_404:
                      raise Http404('Invalid field sorting. If DEBUG were set to ' +
--- 98,119 ----
          order_by = context['request'].field
          if len(order_by) > 1:
              try:
!                 if isinstance(value, QuerySet):
!                     # more flexible but generally more error-prone check:
!                     #    callable(getattr(value, 'order_by', None))
!                     context[key] = value.order_by(order_by)
!                 # sort iterable
!                 elif hasattr(value, '__iter__'):
!                     if order_by[0]=='-': # descending order
!                         reverse = True
!                         order_by = order_by[1:]
!                     else: # ascending order (standard)
!                         reverse = False
!                     context[key] =\
!                         sorted(value,key=attrgetter(order_by),reverse=reverse)
!                 else:
!                     raise AttributeError("Expected QuerySet or iterable under\
!                                           template variable '%s'." % key)
              except template.TemplateSyntaxError:
                  if INVALID_FIELD_RAISES_404:
                      raise Http404('Invalid field sorting. If DEBUG were set to ' +

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions