如果我想向管理员注册我的模型,我必须这样做:
#admin.py
admin.site.register(models.About)
但是对于多个模型,你不能做这样的事情:
models = (models.Project, models.Client, models.About)
for m in models:
admin.site.register(m)
首先:为什么不!?其次:想象一个人有很多模型,它们都应该可以从管理界面访问。你如何以通用的方式做到这一点?
如果我想向管理员注册我的模型,我必须这样做:
#admin.py
admin.site.register(models.About)
但是对于多个模型,你不能做这样的事情:
models = (models.Project, models.Client, models.About)
for m in models:
admin.site.register(m)
首先:为什么不!?其次:想象一个人有很多模型,它们都应该可以从管理界面访问。你如何以通用的方式做到这一点?
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)
我在我的网站上对此进行了测试,并且运行良好。
对于最近发布的 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
# File: admin.py
from django.contrib import admin
from .models import Project, Client, About
admin.register(Project, Client, About)(admin.ModelAdmin)
根据这里的代码段,我通常做的是在我的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')
在 admin.py 中使用 Django 3.1.3
from .models import Course, Category
admin.site.register(Course)
admin.site.register(Category)
这是注册多个模型的更好方法
from django.contrib import admin
from myapp.models import Course, Category
admin.site.register(Course)
admin.site.register(Category)
这是一个尝试将自定义模型注册到管理 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)
from django.contrib import admin
from .models import *
@admin.register(Project, Client, About)
class AppAdmin(admin.ModelAdmin):
pass