You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django BaseAdmin通用化?适配无指定字段的模型

解决方案

要实现BaseAdmin的通用化,仅将模型中实际存在的字段设为只读字段,核心思路是在get_readonly_fields方法中动态过滤基础只读字段列表,只保留当前模型已定义的字段。

修改后的代码如下:

class BaseAdmin(admin.ModelAdmin):
    base_readonly_fields = ('created', 'updated','removed')

    def get_readonly_fields(self, request, obj=None):
        # 过滤出当前模型中存在的基础只读字段
        valid_base_fields = [
            field for field in self.base_readonly_fields
            if hasattr(self.model, field)
        ]
        
        # 合并子类自定义只读字段与有效基础字段
        if self.readonly_fields:
            return tuple(self.readonly_fields) + tuple(valid_base_fields)
        else:
            return tuple(valid_base_fields)


@admin.register(models.Example)
class Example(BaseAdmin):
    list_display = ['id', 'name', 'sf_id', ]

关键说明:

  • 通过hasattr(self.model, field)检查当前模型是否包含目标字段,彻底避免因字段不存在引发的报错。
  • 保留子类自定义readonly_fields的逻辑,将其与过滤后的有效基础字段合并,不破坏原有业务配置。
  • 最终返回的只读字段集合仅包含模型实际存在的字段,实现BaseAdmin对不同模型的通用适配。

内容的提问来源于stack exchange,提问作者Mehdi Aria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:00:59