diff --git a/django/contrib/admin/__init__.py b/django/contrib/admin/__init__.py index 6a459ec22a..56b64faacb 100644 --- a/django/contrib/admin/__init__.py +++ b/django/contrib/admin/__init__.py @@ -1,3 +1,16 @@ from django.contrib.admin.options import ModelAdmin, HORIZONTAL, VERTICAL from django.contrib.admin.options import StackedInline, TabularInline from django.contrib.admin.sites import AdminSite, site + +def autodiscover(): + """ + Auto-discover INSTALLED_APPS admin.py modules and fail silently when + not present. This forces an import on them to register any admin bits they + may want. + """ + from django.conf import settings + for app in settings.INSTALLED_APPS: + try: + __import__("%s.admin" % app) + except ImportError: + pass diff --git a/docs/admin.txt b/docs/admin.txt index 996930fc2b..08cafc2450 100644 --- a/docs/admin.txt +++ b/docs/admin.txt @@ -609,11 +609,16 @@ In this example, we register the default ``AdminSite`` instance # urls.py from django.conf.urls.defaults import * from django.contrib import admin + + admin.autodiscover() urlpatterns = patterns('', ('^admin/(.*)', admin.site.root), ) +Above we used ``admin.autodiscover()`` to automatically load the +``INSTALLED_APPS`` admin.py modules. + In this example, we register the ``AdminSite`` instance ``myproject.admin.admin_site`` at the URL ``/myadmin/`` :: @@ -625,6 +630,10 @@ In this example, we register the ``AdminSite`` instance ('^myadmin/(.*)', admin_site.root), ) +There is really no need to use autodiscover when using your own ``AdminSite`` +instance since you will likely be importing all the per-app admin.py modules +in your ``myproject.admin`` module. + Note that the regular expression in the URLpattern *must* group everything in the URL that comes after the URL root -- hence the ``(.*)`` in these examples.