Django

Django 批量向admin注册模型

2023-02-13  本文已影响0人  alue

如果有大量模型需要注册到 admin 页面, 手工一个个复制粘贴,然后修改名称, 还挺麻烦. 有没有自动化途经呢?

一个最直观的做法如下:

from django.apps import apps  
  
models = apps.get_models()  
  
for model in models:  
    admin.site.register(model)

的确能够完成目标, 但存在一个缺陷. 如果有些模型已经被注册过了, 那么程序将抛出异常, 因为模型不能重复注册.

所以, 可以做个异常处理, 如果已经注册, 那就 pass.

from django.apps import apps  
  
models = apps.get_models()  
  
for model in models:  
try:  
    admin.site.register(model)  
except admin.sites.AlreadyRegistered:  
    pass

这里要注意, 上述代码必须放在所有 admin 注册行为之后运行.

如果, 我们想让注册后的 admin 列表页自动显示所有字段, 那该如何修改上述代码呢?
我们可以利用 admin.register(model_or_iterable, admin_class=None) 方法的第二个参数 admin_class , 来实现这一行为.

通过构造 mixin 类 ListAdminMixin, 实现 list_display 的动态获取:

from django.apps import apps  
from django.contrib import admin  
  
  
class ListAdminMixin(object):  
    def __init__(self, model, admin_site):  
        self.list_display = [field.name for field in 
        model._meta.fields]  
        super(ListAdminMixin, self).__init__(model, admin_site)  
  
  
models = apps.get_models()  
for model in models:  
    admin_class = type('AdminClass',
    (ListAdminMixin,admin.ModelAdmin), {})  
    try:  
        admin.site.register(model, admin_class)  
    except admin.sites.AlreadyRegistered:  
        pass

这样就实现了预期的功能.

上一篇 下一篇

猜你喜欢

热点阅读