diff options
| author | Hasan Ramezani <hasan.r67@gmail.com> | 2019-03-23 18:10:06 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-03-25 17:34:53 -0400 |
| commit | d4df5e1b0b1c643fe0fc521add0236764ec8e92a (patch) | |
| tree | 213b13802a232ed76b909f2605824a429b66babb | |
| parent | 981dd6dd71ea80e5149c2eff564622e96c12b5be (diff) | |
Fixed #27360 -- Added app or ModelAdmin details for AreadyRegistered exceptions.
| -rw-r--r-- | django/contrib/admin/sites.py | 10 | ||||
| -rw-r--r-- | tests/admin_registration/tests.py | 11 |
2 files changed, 19 insertions, 2 deletions
diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index 6842f49684..116303c94a 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -1,3 +1,4 @@ +import re from functools import update_wrapper from weakref import WeakSet @@ -106,7 +107,14 @@ class AdminSite: ) if model in self._registry: - raise AlreadyRegistered('The model %s is already registered' % model.__name__) + registered_admin = str(self._registry[model]) + msg = 'The model %s is already registered ' % model.__name__ + if registered_admin.endswith('.ModelAdmin'): + # Most likely registered without a ModelAdmin subclass. + msg += 'in app %r.' % re.sub(r'\.ModelAdmin$', '', registered_admin) + else: + msg += 'with %r.' % registered_admin + raise AlreadyRegistered(msg) # Ignore the registration if the model has been # swapped out. diff --git a/tests/admin_registration/tests.py b/tests/admin_registration/tests.py index 8601328647..93031bfbf3 100644 --- a/tests/admin_registration/tests.py +++ b/tests/admin_registration/tests.py @@ -30,10 +30,19 @@ class TestRegistration(SimpleTestCase): def test_prevent_double_registration(self): self.site.register(Person) - msg = 'The model Person is already registered' + msg = "The model Person is already registered in app 'admin_registration'." with self.assertRaisesMessage(admin.sites.AlreadyRegistered, msg): self.site.register(Person) + def test_prevent_double_registration_for_custom_admin(self): + class PersonAdmin(admin.ModelAdmin): + pass + + self.site.register(Person, PersonAdmin) + msg = "The model Person is already registered with 'admin_registration.PersonAdmin'." + with self.assertRaisesMessage(admin.sites.AlreadyRegistered, msg): + self.site.register(Person, PersonAdmin) + def test_registration_with_star_star_options(self): self.site.register(Person, search_fields=['name']) self.assertEqual(self.site._registry[Person].search_fields, ['name']) |
