1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

Fixed #10743 -- Allowed lookups for related fields in ModelAdmin.list_display.

Co-authored-by: Alex Garcia <me@alexoteiza.com>
Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
Co-authored-by: Nina Menezes <https://github.com/nmenezes0>
This commit is contained in:
Tom Carrick
2023-04-04 15:11:11 +01:00
committed by Natalia
parent 3580b47ed3
commit 4ade8386eb
13 changed files with 186 additions and 46 deletions

View File

@@ -53,6 +53,10 @@ class ChildAdmin(admin.ModelAdmin):
return super().get_queryset(request).select_related("parent")
class GrandChildAdmin(admin.ModelAdmin):
list_display = ["name", "parent__name", "parent__parent__name"]
class CustomPaginationAdmin(ChildAdmin):
paginator = CustomPaginator

View File

@@ -19,6 +19,11 @@ class Child(models.Model):
age = models.IntegerField(null=True, blank=True)
class GrandChild(models.Model):
parent = models.ForeignKey(Child, models.SET_NULL, editable=False, null=True)
name = models.CharField(max_length=30, blank=True)
class Genre(models.Model):
name = models.CharField(max_length=20)

View File

@@ -42,6 +42,7 @@ from .admin import (
EmptyValueChildAdmin,
EventAdmin,
FilteredChildAdmin,
GrandChildAdmin,
GroupAdmin,
InvitationAdmin,
NoListDisplayLinksParentAdmin,
@@ -61,6 +62,7 @@ from .models import (
CustomIdUser,
Event,
Genre,
GrandChild,
Group,
Invitation,
Membership,
@@ -1634,6 +1636,62 @@ class ChangeListTests(TestCase):
response, f'0 results (<a href="{href}">1 total</a>)'
)
def test_list_display_related_field(self):
parent = Parent.objects.create(name="I am your father")
child = Child.objects.create(name="I am your child", parent=parent)
GrandChild.objects.create(name="I am your grandchild", parent=child)
request = self._mocked_authenticated_request("/grandchild/", self.superuser)
m = GrandChildAdmin(GrandChild, custom_site)
response = m.changelist_view(request)
self.assertContains(response, parent.name)
self.assertContains(response, child.name)
def test_list_display_related_field_null(self):
GrandChild.objects.create(name="I am parentless", parent=None)
request = self._mocked_authenticated_request("/grandchild/", self.superuser)
m = GrandChildAdmin(GrandChild, custom_site)
response = m.changelist_view(request)
self.assertContains(response, '<td class="field-parent__name">-</td>')
self.assertContains(response, '<td class="field-parent__parent__name">-</td>')
def test_list_display_related_field_ordering(self):
parent_a = Parent.objects.create(name="Alice")
parent_z = Parent.objects.create(name="Zara")
Child.objects.create(name="Alice's child", parent=parent_a)
Child.objects.create(name="Zara's child", parent=parent_z)
class ChildAdmin(admin.ModelAdmin):
list_display = ["name", "parent__name"]
list_per_page = 1
m = ChildAdmin(Child, custom_site)
# Order ascending.
request = self._mocked_authenticated_request("/grandchild/?o=1", self.superuser)
response = m.changelist_view(request)
self.assertContains(response, parent_a.name)
self.assertNotContains(response, parent_z.name)
# Order descending.
request = self._mocked_authenticated_request(
"/grandchild/?o=-1", self.superuser
)
response = m.changelist_view(request)
self.assertNotContains(response, parent_a.name)
self.assertContains(response, parent_z.name)
def test_list_display_related_field_ordering_fields(self):
class ChildAdmin(admin.ModelAdmin):
list_display = ["name", "parent__name"]
ordering = ["parent__name"]
m = ChildAdmin(Child, custom_site)
request = self._mocked_authenticated_request("/", self.superuser)
cl = m.get_changelist_instance(request)
self.assertEqual(cl.get_ordering_field_columns(), {2: "asc"})
class GetAdminLogTests(TestCase):
def test_custom_user_pk_not_named_id(self):