2012-02-25 60 views
23

我有一個名爲doors的應用程序,我的models.py爲應用程序有10個表/類。在我的admin.py下,如何在文件models.py中註冊每個型號?註冊Django管理頁面中的應用程序的每個表/類

例如,目前我不得不硬編碼:

from django.contrib import admin 
from doors.models import * 

admin.site.register(Group) 
admin.site.register(Item) 
admin.site.register(ItemType) 
admin.site.register(Location) 
admin.site.register(Log) 
admin.site.register(Order) 
admin.site.register(Property) 
admin.site.register(User) 
admin.site.register(Vendor) 

有沒有一種方法,我可能會找到通過models.py每類循環和註冊每個班級?或者是否有某種我可以用於Django的通配符?

+2

這段代碼是做你想做的:http://djangosnippets.org/snippets/2066/? – arie 2012-02-25 12:26:16

+0

謝謝。看代碼有很多幫助。 – hobbes3 2012-02-25 13:08:24

回答

16

我想通了與@阿里的(Django的< 1.8)鏈接:

from django.contrib import admin 
from django.db.models import get_models, get_app 

for model in get_models(get_app('doors')): 
    admin.site.register(model) 

但我不知道如果我能做到這一點沒有get_app ...不能代碼足夠聰明,知道它自己的應用程序的名稱?

+0

關於第二個想法,我意識到這可能是一個壞主意,因爲你無法註冊模型兩次。因此,僅當您不需要對管理頁面中的模型進行任何定製(即列表視圖,過濾器等)時,請使用此代碼。 – hobbes3 2012-02-26 14:23:00

+0

要添加到此,您可以使用此代碼並按名稱排除特定模型(即具有自定義的模型):對於get_models中的模型(get_app('base')): if model .__ name__!='Subscriber': admin .site.register(model) – Erve1879 2013-10-20 08:15:03

+0

@ hobbes3你不能取消註冊和註冊嗎?至少在Django 1。7,不確定'12 :) – EralpB 2014-11-07 22:46:03

24

似乎get_models和get_app在django 1.8中不再可用。

以下可用於:

from django.contrib import admin 
from django.apps import apps 

app = apps.get_app_config('dashboard') 

for model_name, model in app.models.items(): 
    admin.site.register(model) 

延長:如果你想顯示模型的全部或選擇字段作爲網格而不是模型對象中的一列Unicode表示你可以使用這個:

app = apps.get_app_config('your_app_name') 
for model_name, model in app.models.items(): 
    model_admin = type(model_name + "Admin", (admin.ModelAdmin,), {}) 

    model_admin.list_display = model.admin_list_display if hasattr(model, 'admin_list_display') else tuple([field.name for field in model._meta.fields]) 
    model_admin.list_filter = model.admin_list_filter if hasattr(model, 'admin_list_filter') else model_admin.list_display 
    model_admin.list_display_links = model.admin_list_display_links if hasattr(model, 'admin_list_display_links') else() 
    model_admin.list_editable = model.admin_list_editable if hasattr(model, 'admin_list_editable') else() 
    model_admin.search_fields = model.admin_search_fields if hasattr(model, 'admin_search_fields') else() 

    admin.site.register(model, model_admin) 

這樣做是什麼,它擴展的ModelAdmin類的飛行,並設置這是需要顯示list_display場模型數據在管理中的網格表示。如果您在模型中將您所需的字段列爲admin_list_display,那麼它將採用該字段,否則將生成模型中可用字段的元組。

可以類似地設置其他可選字段,如list_filter

有關list_display的更多信息,請參閱django documentation

11

從Django的1.7,您可以使用此代碼在您的admin.py:

from django.apps import apps 
from django.contrib import admin 
from django.contrib.admin.sites import AlreadyRegistered 

app_models = apps.get_app_config('my_app').get_models() 
for model in app_models: 
    try: 
     admin.site.register(model) 
    except AlreadyRegistered: 
     pass 
4

從Django的1.8,修正錯誤消息

RemovedInDjango19Warning: django.db.models.get_app is deprecated. 

我們可以在2使用這種方法行

from django.contrib import admin 
from my_app.models import * 
from django.apps import apps 

for model in apps.get_app_config('my_app').models.values(): 
    admin.site.register(model)