如何向管理员注册多个模型?

问题描述 投票:0回答:9

如果我想向管理员注册我的模型,我必须这样做:

#admin.py
admin.site.register(models.About)

但是对于多个模型,你不能做这样的事情:

models = (models.Project, models.Client, models.About)
for m in models:
   admin.site.register(m)

首先:为什么不呢?其次:想象一个人有很多模型,所有这些模型都应该可以从管理界面访问。你如何以通用的方式做到这一点?

django django-admin
9个回答
56
投票

admin.site.register
在库中有这样的定义:

def register(self, model_or_iterable, admin_class=None, **options):

所以要注册的模型可以是单个模型或可迭代对象,所以只需使用这个:

myModels = [models.Project, models.Client, models.About]  # iterable list
admin.site.register(myModels)

我在我的网站上对此进行了测试,效果非常好。


7
投票
# File: admin.py
from django.contrib import admin
from .models import Project, Client, About

admin.register(Project, Client, About)(admin.ModelAdmin)

6
投票

对于最近发布的 Django 1.7,您可以使用

django.contrib.admin.register
装饰器来注册使用同一管理类的多个模型。

from django.contrib import admin
from .models import Project, Client, About

@admin.register(Project, Client, About)
class DefaultAdmin(admin.ModelAdmin):
    pass

更新

考虑进行一个简单的调用,而不是声明一个虚拟类


4
投票

基于here的代码片段,我通常做的就是在我的

admin.py

中添加以下代码
from django.db.models import get_models, get_app
from django.contrib import admin
from django.contrib.admin.sites import AlreadyRegistered

def autoregister(*app_list):
    for app_name in app_list:
        app_models = get_app(app_name)
        for model in get_models(app_models):
            try:
                admin.site.register(model)
            except AlreadyRegistered:
                pass

autoregister('myapp')

3
投票

这是注册多个模型的更好方法

from django.contrib import admin
from myapp.models import Course, Category

admin.site.register(Course)
admin.site.register(Category)

2
投票

使用 Django 3.1.3 在 admin.py 中

from .models import Course, Category

admin.site.register(Course)
admin.site.register(Category)

0
投票
from django.contrib import admin

from .models import *


@admin.register(Project, Client, About)
class AppAdmin(admin.ModelAdmin):
    pass

0
投票

这是一种解决方法,尝试将自定义模型注册到管理 UI(如果存在,否则是默认模型),要使其正常工作,您必须遵循将自定义管理类命名为“MyModelAdmin”的约定,方法是将“Admin”附加到结束。

for model_name, model in apps.get_app_config('myapp').models.items() :
    if      '_' not in model_name   :
        if      globals().get(model.__name__+'Admin')   :
            admin.site.register(model, globals().get(model.__name__+'Admin'))
        else                                        :
            admin.site.register(model)

0
投票
from django.apps import apps
from django.contrib import admin

models = apps.get_models()

for model in models:
    try:
        admin.site.register(model)
    except admin.sites.AlreadyRegistered:
        pass
© www.soinside.com 2019 - 2024. All rights reserved.