summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2019-03-23 18:10:06 +0100
committerTim Graham <timograham@gmail.com>2019-03-25 17:34:53 -0400
commitd4df5e1b0b1c643fe0fc521add0236764ec8e92a (patch)
tree213b13802a232ed76b909f2605824a429b66babb
parent981dd6dd71ea80e5149c2eff564622e96c12b5be (diff)
Fixed #27360 -- Added app or ModelAdmin details for AreadyRegistered exceptions.
-rw-r--r--django/contrib/admin/sites.py10
-rw-r--r--tests/admin_registration/tests.py11
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'])