From 5fa4ccab7e42e86fa4a0681d21bd1326c9c5eac3 Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:09:55 +0100 Subject: Refs #26001 -- Handled relationship exact lookups in ModelAdmin.search_fields. --- tests/admin_changelist/admin.py | 1 + tests/admin_changelist/tests.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) (limited to 'tests') diff --git a/tests/admin_changelist/admin.py b/tests/admin_changelist/admin.py index d9dc498e84..937beea48f 100644 --- a/tests/admin_changelist/admin.py +++ b/tests/admin_changelist/admin.py @@ -56,6 +56,7 @@ class ChildAdmin(admin.ModelAdmin): class GrandChildAdmin(admin.ModelAdmin): list_display = ["name", "parent__name", "parent__parent__name"] + search_fields = ["parent__name__exact", "parent__age__exact"] site.register(GrandChild, GrandChildAdmin) diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index a823a72f7d..0be6a54ed4 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -879,6 +879,28 @@ class ChangeListTests(TestCase): cl = model_admin.get_changelist_instance(request) self.assertCountEqual(cl.queryset, expected_result) + def test_search_with_exact_lookup_relationship_field(self): + child = Child.objects.create(name="I am a child", age=11) + grandchild = GrandChild.objects.create(name="I am a grandchild", parent=child) + model_admin = GrandChildAdmin(GrandChild, custom_site) + + request = self.factory.get("/", data={SEARCH_VAR: "'I am a child'"}) + request.user = self.superuser + cl = model_admin.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [grandchild]) + for search_term, expected_result in [ + ("11", [grandchild]), + ("'I am a child'", [grandchild]), + ("1", []), + ("A", []), + ("random", []), + ]: + request = self.factory.get("/", data={SEARCH_VAR: search_term}) + request.user = self.superuser + with self.subTest(search_term=search_term): + cl = model_admin.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, expected_result) + def test_no_distinct_for_m2m_in_list_filter_without_params(self): """ If a ManyToManyField is in list_filter but isn't in any lookup params, -- cgit v1.3