from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from tunes.models import Song
class SpecialOrderingChangeList(ChangeList):
def apply_special_ordering(self, queryset):
order_type, order_by = [self.params.get(param, None) for param in ('ot', 'o')]
special_ordering = self.model_admin.special_ordering
if special_ordering and order_type and order_by:
try:
order_field = self.list_display[int(order_by)]
ordering = special_ordering[order_field]
if order_type == 'desc':
ordering = ['-' + field for field in ordering]
queryset = queryset.order_by(*ordering)
except IndexError:
return queryset
except KeyError:
return queryset
return queryset
def get_query_set(self):
queryset = super(SpecialOrderingChangeList, self).get_query_set()
queryset = self.apply_special_ordering(queryset)
return queryset
class SongAdmin(admin.ModelAdmin):
list_display = ['name', 'time', 'artist', 'album', 'track', 'total_tracks']
special_ordering = {'artist': ('artist', 'album', 'track'), 'album': ('album', 'track')}
def get_changelist(self, request, **kwargs):
return SpecialOrderingChangeList
admin.site.register(Song, SongAdmin)
Comments
Thanks a lot for that snippet. Was just about to get some bad headache about the multiple column sorting when I stumbled over this. Saved my day!!
Alex
#
This does not seem to work for extra fields defined in the model class using the "def Field" function... anyone able to upgrade it to do so?
#
I have enhanced this a little by taking into account default ordering and also default model ordering if it's not defined in admin:
#
The script by xaralis (on December 2, 2010) returns errors: list.index(x): x not in list
Any ideas on this?
#
gamesbook: I've just bumped into this as well. You should double-check what you have in ordering and special_ordering attributes. The special_ordering should always contain attribute which is named as one of model's own, something special will not work, e.g.:
This won't work.
This will.
#
You saved my day! Thanks
Even though I quite changed it :
#