summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAlexander Gaevsky <sasha@sasha0.ru>2016-02-09 02:35:03 +0200
committerTim Graham <timograham@gmail.com>2018-02-07 17:46:28 -0500
commitef2512b2ffdb719e5c0fb82142f9ce8478282823 (patch)
treeba07310c6630e4b4f1d19239668c7de05d653e86 /django
parent7d96f0c49ab750799860e42716d7105e11de44de (diff)
Fixed #25790 -- Allowed disable column sorting in the admin changelist.
Thanks Ramiro Morales for completing the patch.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py7
-rw-r--r--django/contrib/admin/templatetags/admin_list.py18
-rw-r--r--django/contrib/admin/views/main.py3
3 files changed, 20 insertions, 8 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 268ce012d1..de28525b78 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -111,6 +111,7 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
formfield_overrides = {}
readonly_fields = ()
ordering = None
+ sortable_by = None
view_on_site = True
show_full_result_count = True
checks_class = BaseModelAdminChecks
@@ -353,6 +354,10 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
qs = qs.order_by(*ordering)
return qs
+ def get_sortable_by(self, request):
+ """Hook for specifying which fields can be sorted in the changelist."""
+ return self.sortable_by if self.sortable_by is not None else self.get_list_display(request)
+
def lookup_allowed(self, lookup, value):
from django.contrib.admin.filters import SimpleListFilter
@@ -688,6 +693,7 @@ class ModelAdmin(BaseModelAdmin):
# Add the action checkboxes if any actions are available.
if self.get_actions(request):
list_display = ['action_checkbox'] + list(list_display)
+ sortable_by = self.get_sortable_by(request)
ChangeList = self.get_changelist(request)
return ChangeList(
request,
@@ -702,6 +708,7 @@ class ModelAdmin(BaseModelAdmin):
self.list_max_show_all,
self.list_editable,
self,
+ sortable_by,
)
def get_object(self, request, object_id, from_field=None):
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index ab0db80301..604021c55d 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -100,6 +100,7 @@ def result_headers(cl):
model_admin=cl.model_admin,
return_attr=True
)
+ is_field_sortable = cl.sortable_by is None or field_name in cl.sortable_by
if attr:
field_name = _coerce_field_name(field_name, i)
# Potentially not sortable
@@ -115,13 +116,16 @@ def result_headers(cl):
admin_order_field = getattr(attr, "admin_order_field", None)
if not admin_order_field:
- # Not sortable
- yield {
- "text": text,
- "class_attrib": format_html(' class="column-{}"', field_name),
- "sortable": False,
- }
- continue
+ is_field_sortable = False
+
+ if not is_field_sortable:
+ # Not sortable
+ yield {
+ 'text': text,
+ 'class_attrib': format_html(' class="column-{}"', field_name),
+ 'sortable': False,
+ }
+ continue
# OK, it is sortable if we got this far
th_classes = ['sortable', 'column-{}'.format(field_name)]
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index 086e66e3b7..5141b9e2f1 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -35,7 +35,7 @@ IGNORED_PARAMS = (
class ChangeList:
def __init__(self, request, model, list_display, list_display_links,
list_filter, date_hierarchy, search_fields, list_select_related,
- list_per_page, list_max_show_all, list_editable, model_admin):
+ list_per_page, list_max_show_all, list_editable, model_admin, sortable_by):
self.model = model
self.opts = model._meta
self.lookup_opts = self.opts
@@ -50,6 +50,7 @@ class ChangeList:
self.list_max_show_all = list_max_show_all
self.model_admin = model_admin
self.preserved_filters = model_admin.get_preserved_filters(request)
+ self.sortable_by = sortable_by
# Get search parameters from the query string.
try: