diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 2caf82a7ef..0d770b079b 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -774,8 +774,15 @@ class ModelAdminChecks(BaseModelAdminChecks): model=model, obj=cls, id='admin.E121') else: if field_name not in cls.list_display: - return refer_to_missing_field(field=field_name, option=label, - model=model, obj=cls, id='admin.E122') + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not " + "contained in 'list_display'." % (label, field_name), + hint=None, + obj=cls, + id='admin.E122', + ) + ] elif cls.list_display_links and field_name in cls.list_display_links: return [ checks.Error( diff --git a/tests/admin_checks/tests.py b/tests/admin_checks/tests.py index e4e09d795b..ec1651be43 100644 --- a/tests/admin_checks/tests.py +++ b/tests/admin_checks/tests.py @@ -70,6 +70,22 @@ class SystemChecksTestCase(TestCase): custom_site.unregister(Song) admin.sites.system_check_errors = [] + def test_field_name_not_in_list_display(self): + class SongAdmin(admin.ModelAdmin): + list_editable = ["original_release"] + + errors = SongAdmin.check(model=Song) + expected = [ + checks.Error( + "The value of 'list_editable[0]' refers to 'original_release', " + "which is not contained in 'list_display'.", + hint=None, + obj=SongAdmin, + id='admin.E122', + ) + ] + self.assertEqual(errors, expected) + def test_readonly_and_editable(self): class SongAdmin(admin.ModelAdmin): readonly_fields = ["original_release"]