diff options
| -rw-r--r-- | django/contrib/admin/checks.py | 8 | ||||
| -rw-r--r-- | tests/modeladmin/test_checks.py | 22 |
2 files changed, 29 insertions, 1 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 10257a54bf..d14515e8a4 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -236,14 +236,20 @@ class BaseModelAdminChecks: id="admin.E038", ) try: + if isinstance(field.remote_field.model, str): + raise NotRegistered related_admin = obj.admin_site.get_model_admin(field.remote_field.model) except NotRegistered: + # field.remote_field.model could be a string or a class. + remote_model = getattr( + field.remote_field.model, "__name__", field.remote_field.model + ) return [ checks.Error( 'An admin for model "%s" has to be registered ' "to be referenced by %s.autocomplete_fields." % ( - field.remote_field.model.__name__, + remote_model, type(obj).__name__, ), obj=obj.__class__, diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py index fbd63abfbf..c493148eb9 100644 --- a/tests/modeladmin/test_checks.py +++ b/tests/modeladmin/test_checks.py @@ -1724,6 +1724,28 @@ class AutocompleteFieldsTests(CheckTestCase): invalid_obj=Admin, ) + @isolate_apps("modeladmin") + def test_autocomplete_e039_unresolved_model(self): + class UnresolvedForeignKeyModel(models.Model): + unresolved = models.ForeignKey("missing.Model", models.CASCADE) + + class Meta: + app_label = "modeladmin" + + class Admin(ModelAdmin): + autocomplete_fields = ("unresolved",) + + self.assertIsInvalid( + Admin, + UnresolvedForeignKeyModel, + msg=( + 'An admin for model "missing.Model" has to be registered ' + "to be referenced by Admin.autocomplete_fields." + ), + id="admin.E039", + invalid_obj=Admin, + ) + def test_autocomplete_e040(self): class NoSearchFieldsAdmin(ModelAdmin): pass |
