diff options
| author | Collin Anderson <cmawebsite@gmail.com> | 2016-08-18 12:45:27 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-08-23 16:06:41 -0400 |
| commit | 4073780219258eec2d3c5f7b84f4f0a3c3cc6515 (patch) | |
| tree | c315ce04c4151e54e386a17fdc10dd0cdfcf1a1a | |
| parent | ae0f55eb491255217d6df31296ec8102007224a6 (diff) | |
[1.10.x] Fixed #26998 -- Reverted some admin checks from checking field.many_to_many back to isinstance(field, models.ManyToManyField).
This partially reverts 983c158da7723eb00a376bd31db76709da4d0260
Backport of 384f89f8f843953ac11cf211f85291b5c14baeb9 from master
| -rw-r--r-- | django/contrib/admin/checks.py | 13 | ||||
| -rw-r--r-- | docs/ref/checks.txt | 8 | ||||
| -rw-r--r-- | docs/releases/1.10.1.txt | 4 | ||||
| -rw-r--r-- | tests/admin_checks/tests.py | 6 | ||||
| -rw-r--r-- | tests/modeladmin/tests.py | 4 |
5 files changed, 20 insertions, 15 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 87788c8f30..240b2f5563 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -217,10 +217,11 @@ class BaseModelAdminChecks(object): # be an extra field on the form. return [] else: - if field.many_to_many and not field.remote_field.through._meta.auto_created: + if (isinstance(field, models.ManyToManyField) and + not field.remote_field.through._meta.auto_created): return [ checks.Error( - "The value of '%s' cannot include the many-to-many field '%s' " + "The value of '%s' cannot include the ManyToManyField '%s', " "because that field manually specifies a relationship model." % (label, field_name), obj=obj.__class__, @@ -393,11 +394,11 @@ class BaseModelAdminChecks(object): return refer_to_missing_field(field=field_name, option=label, model=model, obj=obj, id='admin.E027') else: - if field.many_to_many or isinstance(field, (models.DateTimeField, models.ForeignKey)): + if isinstance(field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField)): return [ checks.Error( "The value of '%s' refers to '%s', which must not be a DateTimeField, " - "a foreign key, or a many-to-many field." % (label, field_name), + "a ForeignKey, or a ManyToManyField." % (label, field_name), obj=obj.__class__, id='admin.E028', ) @@ -621,10 +622,10 @@ class ModelAdminChecks(BaseModelAdminChecks): id='admin.E108', ) ] - elif getattr(field, 'many_to_many', False): + elif isinstance(field, models.ManyToManyField): return [ checks.Error( - "The value of '%s' must not be a many-to-many field." % label, + "The value of '%s' must not be a ManyToManyField." % label, obj=obj.__class__, id='admin.E109', ) diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt index 03bdba97db..fce22689fe 100644 --- a/docs/ref/checks.txt +++ b/docs/ref/checks.txt @@ -302,7 +302,7 @@ with the admin site: ``fields``. * **admin.E012**: There are duplicate field(s) in ``fieldsets[n][1]``. * **admin.E013**: ``fields[n]/fieldsets[n][m]`` cannot include the - many-to-many field ``<field name>``, because that field manually specifies a + ``ManyToManyField`` ``<field name>``, because that field manually specifies a relationship model. * **admin.E014**: The value of ``exclude`` must be a list or tuple. * **admin.E015**: The value of ``exclude`` contains duplicate field(s). @@ -326,8 +326,8 @@ with the admin site: * **admin.E027**: The value of ``prepopulated_fields`` refers to ``<field name>``, which is not an attribute of ``<model>``. * **admin.E028**: The value of ``prepopulated_fields`` refers to - ``<field name>``, which must not be a ``DateTimeField``, a foreign key or a - many-to-many field. + ``<field name>``, which must not be a ``DateTimeField``, a ``ForeignKey``, or a + ``ManyToManyField`` field. * **admin.E029**: The value of ``prepopulated_fields[<field name>]`` must be a list or tuple. * **admin.E030**: The value of ``prepopulated_fields`` refers to @@ -361,7 +361,7 @@ with the admin site: 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 - many-to-many field. + ``ManyToManyField`` field. * **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/docs/releases/1.10.1.txt b/docs/releases/1.10.1.txt index e8dc05c7eb..88edfa80cf 100644 --- a/docs/releases/1.10.1.txt +++ b/docs/releases/1.10.1.txt @@ -61,3 +61,7 @@ Bugfixes * Fixed ``contrib.admindocs`` crash when a view is in a class, such as some of the admin views (:ticket:`27018`). + +* Reverted a few admin checks that checked ``field.many_to_many`` back to + ``isinstance(field, models.ManyToManyField)`` since it turned out the checks + weren't suitable to be generalized like that (:ticket:`26998`). diff --git a/tests/admin_checks/tests.py b/tests/admin_checks/tests.py index c584cd42c9..2cf7f66d9d 100644 --- a/tests/admin_checks/tests.py +++ b/tests/admin_checks/tests.py @@ -583,7 +583,7 @@ class SystemChecksTestCase(SimpleTestCase): errors = BookAdmin(Book, AdminSite()).check() expected = [ checks.Error( - "The value of 'fields' cannot include the many-to-many field 'authors' " + "The value of 'fields' cannot include the ManyToManyField 'authors', " "because that field manually specifies a relationship model.", obj=BookAdmin, id='admin.E013', @@ -601,8 +601,8 @@ class SystemChecksTestCase(SimpleTestCase): errors = FieldsetBookAdmin(Book, AdminSite()).check() expected = [ checks.Error( - "The value of 'fieldsets[1][1][\"fields\"]' cannot include the many-to-many field " - "'authors' because that field manually specifies a relationship model.", + "The value of 'fieldsets[1][1][\"fields\"]' cannot include the ManyToManyField " + "'authors', because that field manually specifies a relationship model.", obj=FieldsetBookAdmin, id='admin.E013', ) diff --git a/tests/modeladmin/tests.py b/tests/modeladmin/tests.py index 990ed9ab32..b58fd0e76a 100644 --- a/tests/modeladmin/tests.py +++ b/tests/modeladmin/tests.py @@ -925,7 +925,7 @@ class PrepopulatedFieldsCheckTests(CheckTestCase): self.assertIsInvalid( ValidationTestModelAdmin, ValidationTestModel, ("The value of 'prepopulated_fields' refers to 'users', which must not be " - "a DateTimeField, a foreign key, or a many-to-many field."), + "a DateTimeField, a ForeignKey, or a ManyToManyField."), 'admin.E028') def test_valid_case(self): @@ -963,7 +963,7 @@ class ListDisplayTests(CheckTestCase): self.assertIsInvalid( ValidationTestModelAdmin, ValidationTestModel, - "The value of 'list_display[0]' must not be a many-to-many field.", + "The value of 'list_display[0]' must not be a ManyToManyField.", 'admin.E109') def test_valid_case(self): |
