diff options
| author | Alexander Gaevsky <sasha@sasha0.ru> | 2016-02-09 02:35:03 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-02-07 17:46:28 -0500 |
| commit | ef2512b2ffdb719e5c0fb82142f9ce8478282823 (patch) | |
| tree | ba07310c6630e4b4f1d19239668c7de05d653e86 /django | |
| parent | 7d96f0c49ab750799860e42716d7105e11de44de (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.py | 7 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/admin_list.py | 18 | ||||
| -rw-r--r-- | django/contrib/admin/views/main.py | 3 |
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: |
