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:
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user