summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBakdolot <80908236+Bakdolot@users.noreply.github.com>2023-04-24 17:14:35 +0600
committerGitHub <noreply@github.com>2023-04-24 08:14:35 -0300
commitc813fb327cb1b09542be89c5ceed367826236bc2 (patch)
tree94f90414368cc6f962fcfb3f7035a1915a92c357
parent83c9765f45e4622e4a5af3adcd92263a28b13624 (diff)
downloaddjango-c813fb327cb1b09542be89c5ceed367826236bc2.tar.gz
Fixed #34481 -- Added system check for reverse related fields in ModelAdmin.list_display.
-rw-r--r--django/contrib/admin/checks.py7
-rw-r--r--docs/ref/checks.txt4
-rw-r--r--tests/modeladmin/test_checks.py15
3 files changed, 21 insertions, 5 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py
index 27537d9614..0fefe65e48 100644
--- a/django/contrib/admin/checks.py
+++ b/django/contrib/admin/checks.py
@@ -916,10 +916,13 @@ class ModelAdminChecks(BaseModelAdminChecks):
id="admin.E108",
)
]
- if isinstance(field, models.ManyToManyField):
+ if isinstance(field, models.ManyToManyField) or (
+ getattr(field, "rel", None) and field.rel.field.many_to_one
+ ):
return [
checks.Error(
- "The value of '%s' must not be a ManyToManyField." % label,
+ f"The value of '{label}' must not be a many-to-many field or a "
+ f"reverse foreign key.",
obj=obj.__class__,
id="admin.E109",
)
diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt
index fa7c633487..9e350a3ff3 100644
--- a/docs/ref/checks.txt
+++ b/docs/ref/checks.txt
@@ -703,8 +703,8 @@ with the admin site:
* **admin.E108**: The value of ``list_display[n]`` refers to ``<label>``,
which is not a callable, an attribute of ``<ModelAdmin class>``, or an
attribute or method on ``<model>``.
-* **admin.E109**: The value of ``list_display[n]`` must not be a
- ``ManyToManyField`` field.
+* **admin.E109**: The value of ``list_display[n]`` must not be a many-to-many
+ field or a reverse foreign key.
* **admin.E110**: The value of ``list_display_links`` must be a list, a tuple,
or ``None``.
* **admin.E111**: The value of ``list_display_links[n]`` refers to ``<label>``,
diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py
index e4ad0636a6..85f2eda69e 100644
--- a/tests/modeladmin/test_checks.py
+++ b/tests/modeladmin/test_checks.py
@@ -537,7 +537,20 @@ class ListDisplayTests(CheckTestCase):
self.assertIsInvalid(
TestModelAdmin,
ValidationTestModel,
- "The value of 'list_display[0]' must not be a ManyToManyField.",
+ "The value of 'list_display[0]' must not be a many-to-many field or a "
+ "reverse foreign key.",
+ "admin.E109",
+ )
+
+ def test_invalid_reverse_related_field(self):
+ class TestModelAdmin(ModelAdmin):
+ list_display = ["song_set"]
+
+ self.assertIsInvalid(
+ TestModelAdmin,
+ Band,
+ "The value of 'list_display[0]' must not be a many-to-many field or a "
+ "reverse foreign key.",
"admin.E109",
)