Ohne admin.autodiscover() in urls.py einzufügen, zeigt die Admin-Seite You don't have permission to edit anything (Siehe SO-Thread).

Warum ist das so? Wenn Sie immer admin.autodiscover() hinzufügen müssen, um Informationen mit dem Administrator zu bearbeiten, obwohl Sie aus Sicherheitsgründen einen Superusernamen und ein Kennwort haben, warum haben die Django-Entwickler admin.autodiscover() nicht automatisch ausgelöst?.

13
Bentley4 9 Okt. 2012 im 23:38

3 Antworten

Beste Antwort

(Bearbeiten: Veraltet nach Django 1.7+, nicht mehr erforderlich, siehe Alasdairs Antwort)

Ich denke, es geht darum, Ihnen eine feinere Kontrolle zu geben. Betrachten Sie den Code von contrib.admin.autodiscover:

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.
    """

    import copy
    from django.conf import settings
    from django.utils.importlib import import_module
    from django.utils.module_loading import module_has_submodule

    for app in settings.INSTALLED_APPS:
        mod = import_module(app)
        # Attempt to import the app's admin module.
        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

            # Decide whether to bubble up this error. If the app just
            # doesn't have an admin module, we can ignore the error
            # attempting to import it, otherwise we want it to bubble up.
            if module_has_submodule(mod, 'admin'):
                raise

Daher werden die Module INSTALLED_APPS admin.py automatisch geladen und schlagen stillschweigend fehl, wenn sie nicht gefunden werden. Nun, es gibt Fälle, in denen Sie dies tatsächlich nicht möchten, z. B. wenn Sie Ihr eigenes AdminSite verwenden:

# urls.py
from django.conf.urls import patterns, url, include
from myproject.admin import admin_site

urlpatterns = patterns('',
    (r'^myadmin/', include(admin_site.urls)),
)

In diesem Fall müssen Sie autodiscovery() nicht aufrufen.

Es gibt auch andere Zeiten, in denen Sie nur eine Teilmenge der Apps Ihrer Projekte über den Administrator anzeigen oder bearbeiten möchten. Wenn Sie autodiscovery() aufrufen, können Sie dies nicht tun.

13
hynekcer 7 Okt. 2016 im 12:39

Für Django müssen Sie nicht Django verwenden. Contrib .admin auf jeder Site - es ist kein Kernmodul.

4
Sean McSomething 10 Okt. 2012 im 00:48

Vor Django 1.7 wurde empfohlen, den Aufruf admin.autodiscover() in urls.py einzufügen. Dadurch konnte es bei Bedarf deaktiviert werden. Das Erfordernis von admin.autodiscover() anstelle des automatischen Aufrufs war ein Beispiel für die Python-Philosophie 'Explicit ist besser als implizit ' in Aktion. Denken Sie daran, dass die django.contrib.admin App optional ist. Sie wird nicht auf jeder Site installiert, daher ist es nicht sinnvoll, immer die automatische Erkennung auszuführen.

Meistens funktioniert die automatische Erkennung gut genug. Wenn Sie jedoch mehr Kontrolle benötigen, können Sie stattdessen die Verwaltungsdateien bestimmter Apps manuell importieren. Beispielsweise möchten Sie möglicherweise mehrere Admin-Sites mit jeweils unterschiedlichen Apps.

Das Laden der App wurde in Django 1.7 überarbeitet. Das autodiscover() wurde in die Standard-App-Konfiguration der Admin-App verschoben. Das bedeutet, dass die automatische Erkennung jetzt ausgeführt wird, wenn die Administrator-App geladen wird, und dass Sie nicht admin.autodiscover() zu Ihrer urls.py hinzufügen müssen. Wenn Sie keine automatische Erkennung wünschen, können Sie sie jetzt mithilfe von SimpleAdminConfig stattdessen.

17
Alasdair 3 Sept. 2015 im 08:35