在Django管理页面中注册应用程序中的每个表/类

hob*_*es3 31 django django-admin

我有一个名为app的应用程序doors,我models.py的应用程序有10个表/类.在我的下admin.py,如何在文件中注册每个模型models.py

例如,目前我必须对其进行硬编码:

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)
Run Code Online (Sandbox Code Playgroud)

有没有办法我可能会找到每个类models.py并循环并注册每个类?或者是否有一些我可以用于Django的通配符?

meh*_*met 35

似乎django 1.8中不再提供get_models和get_app.

可以使用以下内容:

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)
Run Code Online (Sandbox Code Playgroud)

EXTENSION:如果您希望将模型的所有或选择字段显示为网格而不是模型对象的单列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)
Run Code Online (Sandbox Code Playgroud)

它的作用是,它动态扩展了ModelAdmin类,并设置了list_display在admin中以网格表示形式显示模型数据所需的字段.如果您在列出您需要的字段模型作为admin_list_display它需要一个,或生成模型中的所有可用字段的元组,否则.

可以类似地设置其他可选字段,例如list_filter.

有关list_display的更多信息,请参阅django文档.


hob*_*es3 21

我用@ arie的链接(对于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)
Run Code Online (Sandbox Code Playgroud)

但是我想知道如果没有这样做我能做到这一点get_app吗?难道代码不够聪明,不知道自己应用程序的名称吗?


Sjo*_*erd 15

从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
Run Code Online (Sandbox Code Playgroud)


Sam*_*han 5

从Django 1.8修复错误消息

RemovedInDjango19Warning: django.db.models.get_app is deprecated.
Run Code Online (Sandbox Code Playgroud)

我们可以在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)
Run Code Online (Sandbox Code Playgroud)