diff options
author | Bakdolot <80908236+Bakdolot@users.noreply.github.com> | 2023-04-24 17:14:35 +0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 08:14:35 -0300 |
commit | c813fb327cb1b09542be89c5ceed367826236bc2 (patch) | |
tree | 94f90414368cc6f962fcfb3f7035a1915a92c357 | |
parent | 83c9765f45e4622e4a5af3adcd92263a28b13624 (diff) | |
download | django-c813fb327cb1b09542be89c5ceed367826236bc2.tar.gz |
Fixed #34481 -- Added system check for reverse related fields in ModelAdmin.list_display.
-rw-r--r-- | django/contrib/admin/checks.py | 7 | ||||
-rw-r--r-- | docs/ref/checks.txt | 4 | ||||
-rw-r--r-- | tests/modeladmin/test_checks.py | 15 |
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", ) |