Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ answer newbie questions, and generally made Django that much better:
Akash Kumar Sen <akashkumarsen4@gmail.com>
Akis Kesoglou <akiskesoglou@gmail.com>
Aksel Ethem <aksel.ethem@gmail.com>
Akshat Sparsh <https://github.com/AKSHATSPAR>
Akshesh Doshi <aksheshdoshi+django@gmail.com>
alang@bright-green.com
Alasdair Nicol <https://al.sdair.co.uk/>
Expand Down
4 changes: 3 additions & 1 deletion django/contrib/admin/templatetags/admin_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ def result_headers(cl):
# Set ordering for attr that is a property, if defined.
if isinstance(attr, property) and hasattr(attr, "fget"):
admin_order_field = getattr(attr.fget, "admin_order_field", None)
if not admin_order_field and LOOKUP_SEP not in field_name:
if not admin_order_field and not (
LOOKUP_SEP in field_name and isinstance(attr, models.Field)
):
is_field_sortable = False

if not is_field_sortable:
Expand Down
23 changes: 22 additions & 1 deletion tests/admin_changelist/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.contrib import admin
from django.contrib.admin.models import LogEntry
from django.contrib.admin.options import IncorrectLookupParameters
from django.contrib.admin.templatetags.admin_list import pagination
from django.contrib.admin.templatetags.admin_list import pagination, result_headers
from django.contrib.admin.tests import AdminSeleniumTestCase
from django.contrib.admin.views.main import (
ALL_VAR,
Expand Down Expand Up @@ -115,6 +115,20 @@ def test_repr(self):
cl = m.get_changelist_instance(request)
self.assertEqual(repr(cl), "<ChangeList: model=Child model_admin=ChildAdmin>")

def test_default_str_column_is_not_sortable(self):
GrandChild.objects.create(name="Grandchild")
m = admin.ModelAdmin(GrandChild, custom_site)
request = self._mocked_authenticated_request("/grandchild/", self.superuser)
cl = m.get_changelist_instance(request)
headers = list(result_headers(cl))
self.assertEqual(cl.list_display[1], "__str__")
self.assertIs(headers[1]["sortable"], False)
response = m.changelist_view(request)
self.assertContains(response, '<th scope="col" class="column-__str__">')
self.assertNotContains(
response, '<th scope="col" class="sortable column-__str__">'
)

def test_specified_ordering_by_f_expression(self):
class OrderedByFBandAdmin(admin.ModelAdmin):
list_display = ["name", "genres", "nr_of_members"]
Expand Down Expand Up @@ -1726,6 +1740,13 @@ def test_list_display_related_field(self):
response = m.changelist_view(request)
self.assertContains(response, parent.name)
self.assertContains(response, child.name)
self.assertContains(
response, '<th scope="col" class="sortable column-parent__name">'
)
self.assertContains(
response,
'<th scope="col" class="sortable column-parent__parent__name">',
)

def test_list_display_related_field_null(self):
GrandChild.objects.create(name="I am parentless", parent=None)
Expand Down
5 changes: 5 additions & 0 deletions tests/admin_views/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4323,6 +4323,11 @@ def test_generic_content_object_in_list_display(self):
FunkyTag.objects.create(content_object=self.pl3, name="hott")
response = self.client.get(reverse("admin:admin_views_funkytag_changelist"))
self.assertContains(response, "%s</td>" % self.pl3)
self.assertContains(response, '<th scope="col" class="column-content_object">')
self.assertNotContains(
response,
'<th scope="col" class="sortable column-content_object">',
)


@override_settings(ROOT_URLCONF="admin_views.urls")
Expand Down
Loading