Skip to content

Instantly share code, notes, and snippets.

@tmc
Created November 30, 2008 06:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tmc/30397 to your computer and use it in GitHub Desktop.
Save tmc/30397 to your computer and use it in GitHub Desktop.
diff --git a/contrib/admin/views/main.py b/contrib/admin/views/main.py
index 1051648..7c7385d 100644
--- a/contrib/admin/views/main.py
+++ b/contrib/admin/views/main.py
@@ -62,7 +62,7 @@ class ChangeList(object):
if ERROR_FLAG in self.params:
del self.params[ERROR_FLAG]
- self.order_field, self.order_type = self.get_ordering()
+ self.order_field, self.order_type = self.get_order_field_and_type()
self.query = request.GET.get(SEARCH_VAR, '')
self.query_set = self.get_query_set()
self.get_results(request)
@@ -129,6 +129,14 @@ class ChangeList(object):
self.multi_page = multi_page
self.paginator = paginator
+ def get_order_field_and_type(self):
+ field = self.ordering[0]
+ type = 'asc'
+ if field[0] == '-':
+ type = 'desc'
+ field = field[1:]
+ return field, type
+
def get_ordering(self):
lookup_opts, params = self.lookup_opts, self.params
# For ordering, first check the "ordering" parameter in the admin
@@ -136,11 +144,7 @@ class ChangeList(object):
# those exist, order descending by ID by default. Finally, look for
# manually-specified ordering from the query string.
ordering = self.model_admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name]
-
- if ordering[0].startswith('-'):
- order_field, order_type = ordering[0][1:], 'desc'
- else:
- order_field, order_type = ordering[0], 'asc'
+
if ORDER_VAR in params:
try:
field_name = self.list_display[int(params[ORDER_VAR])]
@@ -163,9 +167,11 @@ class ChangeList(object):
order_field = f.name
except (IndexError, ValueError):
pass # Invalid ordering specified. Just use the default.
- if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
- order_type = params[ORDER_TYPE_VAR]
- return order_field, order_type
+ if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] == 'desc':
+ order_field = '-%s' % order_field
+ ordering = [order_field] + ordering
+ return ordering
+ ordering = property(get_ordering)
def get_query_set(self):
qs = self.root_query_set
@@ -211,8 +217,7 @@ class ChangeList(object):
break
# Set ordering.
- if self.order_field:
- qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))
+ qs = qs.order_by(*self.ordering)
# Apply keyword searches.
def construct_search(field_name):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment