在Django管理站点中进行数据录入的最佳实践(同一模型的不同ModelAdmin)

1 投票
1 回答
572 浏览
提问于 2025-04-17 15:04

在Django的管理后台中,如何添加一个自定义视图以便于批量数据录入是个好问题。我有一个模型叫做foo,它已经有了一个ModelAdmin _FooAdmin_。这个设置适合用来编辑和调整数据,但为了方便批量录入数据,我想添加一个额外的视图,里面有一个表单,可以一次性添加,比如20个foo

我不能再添加一个新的ModelAdmin,因为Django会报错,提示AlreadyRegistered: The model foo is already registered,意思是这个模型已经注册过了。

我在文档中看到可以重写get_urls(),但这样做感觉有点不太正规,因为我只是想在同一个模型上有两个稍微不同的ModelAdmin

有没有什么建议呢?

1 个回答

1

我有一个叫做 InspectorCheck 的模型,还有两个 ModelAdmin 类,都是为了这个模型服务的。一个是用来显示那些没有被删除的记录,另一个是用来显示被删除的记录。

这个功能会创建一个新的代理模型类,这个类是从主模型继承过来的:

def create_proxymodel(model_from, name=None, attrs=None, meta=None):
    attrs, meta = (attrs if attrs else {}, meta if meta else {})

    class  Meta:
        proxy = True
        app_label = model_from._meta.app_label

    for k, v in meta.items():
        setattr(Meta, k, v)

    attrs.update({'__module__': '', 'Meta': Meta})
    newmodel = type(name, (model_from,), attrs)

    return newmodel

两个 ModelAdmin 用于不同的目的:

class InspectorCheckAdmin(admin.ModelAdmin):
    list_display = ('id', 'check_address', 'check_form', 'check_target_name')

class InspectorCheckAdminDeleted(admin.ModelAdmin): # or inherit from other ModelAdmin
    list_display = ('id', 'check_address', 'check_form', 'check_target_name', 'editor', 'updated')
    def queryset(self, request):
        return InspectorCheck.trash


#and in last step create and register both classes:

InspectorCheckDeleted = create_proxymodel(InspectorCheck, 'InspectorCheckDeleted', meta={
    'verbose_name': u'Inspector check (deleted)',
    'verbose_name_plural': u'Inspector checks (deleted)'}
)
admin.site.register(InspectorCheck, InspectorCheckAdmin)
admin.site.register(InspectorCheckDeleted, InspectorCheckAdminDeleted)

撰写回答