13

admin.autodiscover()urls.pyを入力しないと、管理ページに表示されますYou don't have permission to edit anythingSOスレッドを参照)。

なんでそうなの?セキュリティのためにスーパーユーザー名とパスワードを持っていても、管理者を使用して情報を編集するために常に追加する必要がある場合、Django開発者が自動的にadmin.autodiscover()トリガーしなかったのはなぜですか?admin.autodiscover()

4

3 に答える 3

18

Django 1.7 より前では、admin.autodiscover()呼び出しを urls.pyに入れることが推奨されていました。これにより、必要に応じて無効にすることができました。自動的に呼び出す代わりに要求するadmin.autodiscover()ことは、Python の哲学「明示的は暗黙的よりも優れている」の実行例です。このdjango.contrib.adminアプリはオプションであり、すべてのサイトにインストールされるわけではないため、常に自動検出を実行しても意味がないことに注意してください。

ほとんどの場合、自動検出は十分に機能します。ただし、より詳細な制御が必要な場合は、代わりに特定のアプリの管理ファイルを手動でインポートできます。たとえば、複数の管理サイトをそれぞれ異なるアプリで登録したい場合があります。

アプリの読み込みは、Django 1.7でリファクタリングされました。autodiscover()、管理アプリのデフォルトのアプリ構成に移動されました。つまり、管理アプリが読み込まれると自動検出が実行されるようにadmin.autodiscover()なり、urls.py に追加する必要がなくなりました。SimpleAdminConfig自動検出が必要ない場合は、代わりにを使用して無効にできるようになりました。

于 2012-10-09T20:10:43.997 に答える
14

(編集: Django 1.7 以降では廃止されました。それ以上は必要ありません。Alasdair の回答を参照してください)

より細かくコントロールできるようになると思います。のコードを考えてみましょう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

そのため、INSTALLED_APPS admin.py モジュールが自動的に読み込まれ、見つからない場合は黙って失敗します。現在、独自の を使用する場合など、実際にはそれを望まない場合がありますAdminSite

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

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

この場合、 を呼び出す必要はありませんautodiscovery()

管理者を介してプロジェクトのアプリのサブセットのみを表示または編集したい場合もありますが、呼び出しでautodiscovery()はそれができません。

于 2012-10-09T21:09:15.247 に答える
4

Django では、Django を使用する必要はありません。すべてのサイトのcontrib .admin - コア モジュールではありません。

于 2012-10-10T00:48:45.537 に答える