python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Django批量向admin注册模型

Django批量向admin注册模型方法详解

作者:alue

这篇文章主要为大家介绍了Django批量向admin注册模型方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

大量模型需要注册到 admin 页面

如果有大量模型需要注册到 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 , 来实现这一行为.

list_display 的动态获取

通过构造 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

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

以上就是Django批量向admin注册模型方法详解的详细内容,更多关于Django批量向admin注册模型的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文