如何在 django admin 中组合两个或多个 ModelAdmin

Posted

技术标签:

【中文标题】如何在 django admin 中组合两个或多个 ModelAdmin【英文标题】:How to combine two or more ModelAdmins in django admin 【发布时间】:2017-07-24 15:13:30 【问题描述】:

contrib 项目提供了两个自定义 ModelAdmin,我想将它们组合到单个模型的管理界面上。如何在一个模型上组合两个或多个 ModelAdmin,以使它们都应用于同一个管理界面?

我的特定场景:我正在使用 geodjango 构建一个 gis 应用程序,它可以跟踪位置。我的数据模型使用 geodjango 提供的 models.PointField() 类型。为了能够在管理面板中编辑位置,我使用 admin.OSMGeoAdmin 管理模型注册了我的模型。

admin.site.register(Prospect, admin.OSMGeoAdmin)

这现在向我显示了一个带有地图的图形位置选择器,这正是我想要的。但是,我想导入和导出这些对象。通常我会为此使用 import_export ModelAdmin,如下所示:

class ProspectResource(resources.ModelResource):

    class Meta:
        model = Prospect

class ProspectIEAdmin(ImportExportModelAdmin):
    resource_class = ProspectResource

admin.site.register(Prospect, admin.ProspectIEAdmin)

如何将这两个 ModelAdmins 组合在同一个模型上,以便我既可以使用图形地图工具设置位置,又可以导入和导出对象?

如果我提前并尝试像这样注册它们:

admin.site.register(Prospect, admin.OSMGeoAdmin)
admin.site.register(Prospect, admin.ProspectIEAdmin)

我收到以下错误:

AttributeError: module 'django.contrib.gis.admin' has no attribute 'ProspectIEAdmin'

我的问题与"how do I have two separate ModelAdmins for the same model." 不同我的问题是如何将两个 ModelAdmins 合并到同一个管理面板中。我知道我可以使用代理模型来创建两个管理面板,一个带有映射工具,一个带有导出工具。但是我希望映射工具和导出工具不能分开注册。

【问题讨论】:

【参考方案1】:

Python 允许多类继承。试试这个:

class ProspectIEAdmin(admin.OSMGeoAdmin, ImportExportModelAdmin):
    resource_class = ProspectResource

admin.site.register(Prospect, ProspectIEAdmin)

【讨论】:

如果需要将两个不同的模型合并为一个带有外键、many_to_many 和其他东西的 models.Admin 会怎样?可以只注册一次吗?

以上是关于如何在 django admin 中组合两个或多个 ModelAdmin的主要内容,如果未能解决你的问题,请参考以下文章

在 1 中组合 2 个或多个正则表达式

Django-admin组件

Django admin,多对多字段,多个重复条目

如何在 Django 模板中嵌套或联合使用两个模板标签?

如何在 django admin 中显示多个模型的更改列表?

如何在c#中动态组合两个或多个DataTables