项目的admin.py,而不是app

时间:2014-06-09 20:24:56

标签: python django

如何指定项目级别admin.py?

我前段时间问过这个问题,因为问题缺乏活动而被授予Tumbleweed奖项! > _<

项目:

  • settings.py
  • admin.py(这就是我想要的工作)
  • ...
  • 应用
    • admin.py(我知道该怎么做)

例如,admin.autodiscover()通常放在项目级别urls.py中(是的,它会自动包含在1.7中)

我想将此以及以下内容移至他们自己的admin.py文件中:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

UserAdmin.list_display = ('email', 'first_name', 'last_name', 'is_active')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
admin.autodiscover()

我尝试这样做,制作一个admin.py文件并将代码添加到其中。没用。

我尝试添加一个名为admin的项目级文件夹,添加了__init__.py并将admin.py扔进了admin文件夹。没工作

此外,我尝试将此admin文件夹添加到INSTALLED_APPS中的settings.py。没有运气。

4 个答案:

答案 0 :(得分:1)

所有admin.autodiscover()都会导入它找到的所有管理文件。没有必要将行本身放在管理文件中。

要理解它为什么不起作用,你需要意识到它是如何工作的。它的作用是导入注册应用程序中的admin.py文件 。已注册的应用程序是包含在INSTALLED_APPS中的包,其中包含models.py.这是值得重复的:如果没有models.py,则不考虑应用程序 - 即使是空白的也可以使用,但如果没有它,则包不是应用程序。

因此,如果在目录中创建空白models.py,请确保该目录位于INSTALLED_APPS中,并将admin.autodisover移回urls.py,一切都会正常工作。

修改

我不确定你想要什么,为什么。正如我所提到的,自动发现取决于应用程序;但正如我所提到的,所有自动发现都会导入所有管理文件。如果您真的不想遵循最佳实践,那么您需要做的就是手动导入管理文件:您可以在通常称为自动发现的相同位置(即主urls.py中)执行此操作。

答案 1 :(得分:0)

来自admin.autodiscover doc字符串:

  

自动发现INSTALLED_APPS admin.py模块并在以后无提示失败   不存在。这会强制导入它们以注册任何管理位   可能想要。

以下是完整的功能:

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

因此,自动发现对您来说唯一的事情就是在已安装的应用程序目录中查找名为admin.py的模块,因此您可以将admin.py放在您想要的地方,只需确保导入它,这样就可以使用它(模型的注册等)得到执行。

重要:我不确定导入自定义路径admin.py的正确时机。但是确保你必须在加载所有相关应用程序后导入它。

答案 2 :(得分:0)

我很想知道这是否会被投票。它似乎有效,但感觉不对。 ; - )

问题是如何覆盖UserAdmin设置。

  1. 将admin.py放在项目文件夹中(与settings.py一起)
  2. from django.contrib.auth import admin
    from django.contrib.auth.admin import UserAdmin
    
    UserAdmin.list_display = ('email', 'first_name', 'last_name',
                              'is_active', 'date_joined', 'last_login',
                              'is_staff')
    UserAdmin.ordering = ['-date_joined']
    
    1. 将您的项目添加到installed_apps(这似乎不对,但我不知道为什么)
    2. 现在您应该在/ admin / auth / user /

      上看到新列和排序顺序

      这对Django 1.11起作用了。到目前为止,我找不到任何问题。你怎么说StackOverflow?

答案 3 :(得分:0)

迟早,一个重度定制的(?,3,1)课程很可能需要一个项目范围admin,因为它是注册所有未被自动发现的每个应用程序管理员的地方。文档提到了这一点,但没有广泛的例子来说明它:

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#customizing-the-adminsite-class

  

请注意,在使用您自己的admin.py实例时,您可能不希望自动发现admin模块,因为您可能会导入AdminSite中的所有每个应用admin模块模块。这意味着您需要在myproject.admin设置中添加'django.contrib.admin.apps.SimpleAdminConfig'而不是'django.contrib.admin'

在wiki中以及多个INSTALLED_APPS网站上有一些过时但有效的示例:

https://code.djangoproject.com/wiki/NewformsAdminBranch

admin