2014-06-09 49 views
3

如何指定项目级别admin.py?admin.py for project,not app

前段时间我问过这个问题,刚刚因为缺乏活动而被授予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_APPSsettings.py。没有运气。

+0

当你把这些东西在admin.py,你有没有在'main'文件中包含'import admin'? – cpb2

回答

0

admin.autodiscover文档字符串:

自动发现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安装的应用程序目录内的一些模块,因此你可以把你的管理。 py你想要的只是确保你导入它,这使得它的代码(模型注册等)被执行。

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

1

全部admin.autodiscover()导入它找到的所有管理文件。将行本身放在管理文件中是毫无意义的。

要理解它不工作的原因,您需要了解它是如何工作的。它所做的是导入管理员。py文件里面的注册应用程序。已注册的应用程序是包含在INSTALLED_APPS中的包含models.py的包。值得重复的是:如果应用程序没有models.py,则不考虑应用程序 - 即使是空白的应用程序也可以正常工作,但如果没有它,则该应用程序不是应用程序。如果您创建您的目录中空白models.py

因此,确保该目录是在INSTALLED_APPS和移动admin.autodisover回urls.py,一切都将正常工作。

编辑

我不太确定你想要什么,以及为什么。正如我所提到的,自动发现取决于应用程序;但正如我也提到的,所有的自动发现都是导入所有的管理文件。如果你真的不想遵循最佳实践,所有你需要做的是手动导入你的管理文件:你可以做的是,在同一个地方,你通常从自动发现调用,即在主urls.py.

+0

所以...你说的是我需要它是一个应用程序...但我不想它是一个应用程序! > _ < –

0

我很好奇,看看是否被downvoted。它似乎工作,但感觉不对。 ;-)

的问题是如何重写UserAdmin设置。

  1. 把一个admin.py在项目文件夹(旁边settings.py)
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'] 
  • 您的项目添加到INSTALLED_APPS(这似乎是错的,但我不知道为什么)
  • 现在你应该看到新的列和排序/管理/认证/用户订单/

    这是Django 1.11为我工作。到目前为止没有我能找到的问题。什么说你StackOverflow?

    0

    迟早,大量定制的admin类很可能需要项目范围admin.py,因为它是注册所有未被自动发现的应用程序管理员的地方。说明文档中提到这一点,但没有广泛的例子来说明吧:

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

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

    有一个有点过时,但在维基或多或少有效的例子,以及多个admin网站:

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

    # project-level admin.py 
    
    from django.contrib import admin 
    from myproject.myapp.models import Book, Author 
    from myproject.anotherapp.models import Musician, Instrument 
    
    site1 = admin.AdminSite() 
    site1.register(Book) 
    site1.register(Author) 
    
    site2 = admin.AdminSite() 
    site2.register(Musician) 
    site2.register(Instrument)