summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/contrib/admin/checks.py8
-rw-r--r--tests/modeladmin/test_checks.py22
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