diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/__init__.py | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/django/contrib/admin/__init__.py b/django/contrib/admin/__init__.py index abc5f09b56..92f23a90e6 100644 --- a/django/contrib/admin/__init__.py +++ b/django/contrib/admin/__init__.py @@ -4,9 +4,6 @@ from django.contrib.admin.options import StackedInline, TabularInline from django.contrib.admin.sites import AdminSite, site from django.utils.importlib import import_module -# A flag to tell us if autodiscover is running. autodiscover will set this to -# True while running, and False when it finishes. -LOADING = False def autodiscover(): """ @@ -14,16 +11,8 @@ def autodiscover(): not present. This forces an import on them to register any admin bits they may want. """ - # Bail out if autodiscover didn't finish loading from a previous call so - # that we avoid running autodiscover again when the URLconf is loaded by - # the exception handler to resolve the handler500 view. This prevents an - # admin.py module with errors from re-registering models and raising a - # spurious AlreadyRegistered exception (see #8245). - global LOADING - if LOADING: - return - LOADING = True + import copy import imp from django.conf import settings @@ -54,6 +43,13 @@ def autodiscover(): # Step 3: import the app's admin file. If this has errors we want them # to bubble up. - import_module("%s.admin" % app) - # autodiscover was successful, reset loading flag. - LOADING = False + try: + before_import_registry = copy.copy(site._registry) + import_module('%s.admin' % app) + except: + # Reset the model registry to the state before the last import as + # this import will have to reoccur on the next request and this + # could raise NotRegistered and AlreadyRegistered exceptions + # (see #8245). + site._registry = before_import_registry + raise |
