2014-06-09 50 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)